假设有一个`Resource`类,它实现了`AutoCloseable`接口,并在`close`方法中模拟了资源释放的过程。在`try-with-resources`语句块中创建了两个`Resource`对象,并在`try`块内部模拟了对这些资源的操作。如果其中一个资源对象的`close`方法抛出了异常,那么下列哪种描述最准确地反映了程序的行为? ```java class Resource implements AutoCloseable { private String name; public Resource(String name) { this.name = name; System.out.println("Resource " + name + " acquired."); } public void operate() { System.out.println("Resource " + name + " operating."); } @Override public void close() throws Exception { if(name.equals("resource2")){ throw new Exception("Exception during close of resource2"); } System.out.println("Resource " + name + " closed."); } } public class Main { public static void main(String[] args) { try (Resource resource1 = new Resource("resource1"); Resource resource2 = new Resource("resource2")) { resource1.operate(); resource2.operate(); } catch (Exception e) { System.err.println("Exception caught: " + e.getMessage()); } } } ```
答案解析
在`try-with-resources`语句中,资源的关闭顺序与创建顺序相反。当`try`块执行完毕后,首先会关闭`resource2`,由于`resource2.close()`会抛出异常,该异常会被`try-with-resources`结构的隐式`catch`块捕获,并传播到外部的`catch`块,然后打印错误信息。然后,`resource1`的`close()`方法会被正常调用。即使`resource2`在关闭时抛出异常,`resource1`的关闭方法仍然会被执行。选项A错误,因为 `resource1`会被正常关闭;选项B错误,抛出的异常会在`close`方法调用后立即捕获;选项C错误,`resource1`的`close`方法会执行;选项D错误,`resource1`的关闭动作不会被抑制。
正确答案:A