Java 何时为控件CTRL+;C忽略

Java 何时为控件CTRL+;C忽略,java,exception-handling,Java,Exception Handling,我有一个java应用程序,它作为一个主方法实现,带有try,catch-finally块。这项工作是在室内完成的。如果我通过bash脚本启动应用程序,并在其执行期间发出CTRL+C,我会注意到不一致的行为。有时执行catch块,有时不执行。这可以解释吗 (下面的示例代码-有时既不记录“捕获”也不记录“关闭完成”) 根据,JVM不保证执行finally块: 如果JVM在执行try或catch代码时退出,那么finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,那么即

我有一个java应用程序,它作为一个主方法实现,带有try,catch-finally块。这项工作是在室内完成的。如果我通过bash脚本启动应用程序,并在其执行期间发出
CTRL+C
,我会注意到不一致的行为。有时执行catch块,有时不执行。这可以解释吗

(下面的示例代码-有时既不记录“捕获”也不记录“关闭完成”)

根据,JVM不保证执行finally块:

如果JVM在执行try或catch代码时退出,那么finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,那么即使整个应用程序继续运行,finally块也可能不会执行

因此,你不能依靠最后一块。
如果您需要捕获CTRL-C事件,最好使用。

这是
C
Java
?哇。请分享一些代码。这取决于SIGINT在执行中的确切位置…@RuchiraGayanRanaweera这是java,他指的是CTRL键的组合+C@RuchiraGayanRanaweera标签上写着java。这个问题似乎离题了,因为OP没有提供与这个问题相关的代码,没有代码就无法回答。最后,重新讨论是有意义的。但是,我是否应该期望调用catch块?感谢为了调用catch块,CTRL-C事件必须触发throwable。但事实并非如此,至少对于Oracle的JVM来说是如此。根据我的测试和文档(),这个信号只是终止进程。再一次,建议“优雅地”处理它的方法是使用关机挂钩。设置起来真的很容易。试试看。
public class Foo {
    public static void main(String[] args) {
       try {
      doStuff();
       } catch (Throwable e) {
          LOGGER.error("Caught.", e);
       } finally {
          LOGGER.info("Shutdown complete.");
       }
    }  
}