我有一个具有明确定义的 Try/Catch/Finally 链的应用程序,它在正常情况下退出并执行 finally 块就好了,但是当有人过早地在 GUI 中点击红色 X 时,程序完全存在(代码 = 0)并且主线程的 finally 块没有被调用。
事实上,我确实希望程序在单击红色 X 时退出,但我不希望跳过 finally{} 块!我在 GUI 中手动放入 finally 块的最重要部分,但我真的不想这样做,因为我希望 GUI 与实际程序分离:
class GUI { // ...
...
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
try {
processObject.getIndicatorFileStream().close();
} catch (Exception ignore) {}
System.exit(0);
}
});
...
}
但我更喜欢这样的电话:
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
并确保在退出后从每个线程调用所有 finally{} 块。
我知道这实际上是预期的。如果应用程序从一个单独的线程(比如 GUI 线程)关闭,那么主线程将停止在其轨道上。
简而言之——我如何确保 System.exit(0) 或 JFrame.EXIT_ON_CLOSE 仍然会导致每个线程的 finally 块执行?