Java, try-finally without catch

Java, try-finally without catch

我正在使用 class 生成器的这种方法:

public void executeAction(String s) throws MyException {
    if (s.equals("exception"))
        throw new MyException("Error, exception", this.getClass().getName());
}

public void close() {
      System.out.println("Closed");
}

我在这段代码中使用了它们:

public void execute() throws MyException  
    Generator generator = new Generator();
    try {
        String string = "exception";
        generator.executeAction(string);
    } finally {
        generator.close();
    }

}

主要我处理了异常:

try {
        manager.execute();
    } catch (MyException e) {
        System.err.println(e.toString());
    }
}

主要是我能抓住它。这是正常行为吗?

是的,这是正确的行为。 try-with-resources 语句抛出抑制异常,这不是你的情况。看看What is a suppressed exception?

当您的 Generator.close() 方法抛出另一个异常时,您将得到一个被抑制的异常 - 在 finally 块中 -:

public void close() {
  throw new OtherException("some msg");//This Exception will be added to your main Exception (MyException) as a Suppressed Exception 
  System.out.println("Closed");
}

所以是的,这是正常行为。

是的,这是正常行为。至少它确保生成器已关闭,但如果 finally 抛出异常,则可能会抑制 try 块中的异常。

使用 java7 你应该使用 try-with-resources.

  1. Generator 实现 AutoCloseable,它会强制执行你已经拥有的 .close() 方法,因此除了实现之外没有真正的改变。

  2. 更改执行方法以使用 try-with-resources

  try(Generator generator = new Generator()) {
      String string = "exception";
      generator.executeAction(string);
  }

好处是,除了更少的代码之外,@Mouad 提到的抑制异常得到了正确处理。 .close() 调用的异常可从 e.getSuppressedException()

获得