我正在为面向对象编程的秋季考试做准备,我们得到的一种任务是提供代码的输出,这些代码通常包含一些异常处理问题。
现在我的问题是 try-with-resources 什么时候关闭它的资源,因为我的输出严格依赖于实现 AutoCloseable 的类的输出。
在提供的代码中,我不明白为什么“close 1”输出出现在“close 40”之前,或者为什么对象 A(40) 在此块末尾关闭。是因为 A(50) 与 A(40) 是同一类型吗?
我的主要问题是 AutoCloseable 何时关闭给定资源,例如示例 m1 当 i=1 时:
1) 创建 A(1) 1b) 执行 Try 块 2) 关闭 A(1) 3) 处理 ArrayIndexOutOfBoundsException?
public class Main {
public static void main(String[] args) {
int[] arr = new int[] { 15, 10 };
for(int i=1; i>=-1; i--){
try(A a40 = new A(40)) {
m1(arr, i);
A a50 = new A(50);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("array exc");
}
catch(Exception e) {
System.out.println("main exc");
break;
}
finally {
System.out.println("main finally");
}
}
System.out.println("main done");
}
private static void m1(int[] arr, int i) throws Exception {
try(A a1 = new A(i)) {
m2(arr[i] + arr[i+1], i);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("m1 exc");
}
System.out.println("m1 done");
}
private static int m2(int x, int y) {
int r = 0;
try{
A a2 = new A(x+y);
r = x / y;
}
finally {
System.out.println("m2 finally");
}
System.out.println("m2 done");
return r;
}
}
以及实现 AutoCloseable 的 A 类:
public class A implements AutoCloseable {
private int x;
public A(int x){
this.x = x;
System.out.println("A " + x);
}
@Override
public void close() throws Exception {
System.out.println("close " + x);
}
}
这是提供的代码的输出:
A 40
A 1
close 1
m1 exc
m1 done
A 50
close 40
main finally
A 40
A 0
A 25
m2 finally
close 0
close 40
main exc
main finally
main done
MMMHUHU
相关分类