为了账号安全,请及时绑定邮箱和手机立即绑定

try-with-resources 什么时候关闭资源?

try-with-resources 什么时候关闭资源?

心有法竹 2023-06-21 16:11:09
我正在为面向对象编程的秋季考试做准备,我们得到的一种任务是提供代码的输出,这些代码通常包含一些异常处理问题。现在我的问题是 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 40A 1close 1m1 excm1 doneA 50close 40main finallyA 40A 0A 25m2 finallyclose 0close 40main excmain finallymain done
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

规范对此非常清楚。

14.20.3。试用资源

try-with-resources 语句使用局部变量(称为资源)进行参数化,这些局部变量在执行 try 块之前初始化,并在执行try 块之后以与初始化相反的顺序自动关闭。

你的例子有点复杂。尝试简化它。您感兴趣的场景有两种:try 块中引发异常,try 块中未引发异常。您调试的消息会提供丰富的信息,因此您将能够轻松跟踪流程。

您可能想查看反编译的 .classes 以了解实际生成的内容。


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信