Search code examples
javaexceptionautocloseable

Autocloseable class doesn't invoke default close method


I have this piece of code:

public class Resource implements AutoCloseable{

    private String s = "I am resource.";
    private int NuberOfResource;

    public Resource(int NuberOfResource) {
        this.NuberOfResource = NuberOfResource;
        System.out.println(s + " My number is: " + NuberOfResource);
    }

    @Override
    public void close() throws Exception {
        System.out.println("Closing...");
    }

    public void print(){
        System.out.println("Hello");
    }

And main class:

public class Main {

    public static void main(String[] args) {
        int a, b = 0;
        a = 5;

        try {
            Resource first = new Resurs(1);
            Resource second = new Resurs(2);
            System.out.println("I will cause exception");
            a /= b;
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

I would like to know why I get this output:

I am resource. My number is 1.
I am resource. My number is 2.
I will cause exception.
java.lang.ArithmeticException: / by zero

Instead of:

I am resource. My number is 1.
I am resource. My number is 2.
Closing...
Closing...
I will cause exception.
java.lang.ArithmeticException: / by zero

Solution

  • Because you're not using try-with-resources. AutoCloseable is only invoked with that, not with regular try/catch statements.

    The correct pattern would be

    try(Resource first = new Resource(1); Resource second = new Resource(2)) {
       // .. whatever
    }