Java的System.exit()如何与try / catch / finally块一起使用?

我知道头痛涉及在try / catch / finally块中返回-在情况下,即使在try或catch块中的返回应该执行的情况下,finally的返回始终是方法的返回。


但是,是否同样适用于System.exit()?例如,如果我有一个try块:


try {

    //Code

    System.exit(0)

}

catch (Exception ex) {

    //Log the exception

}

finally {

    System.exit(1)

}

如果没有例外,将调用哪个System.exit()?如果出口是一个return语句,则将始终调用System.exit(1)行。但是,我不确定exit的行为是否与return不同。


在极端情况下,代码很难复制,即使不是不可能,因此我不能编写单元测试。如果有几分钟的空闲时间,我将在今天晚些时候尝试进行实验,但是我还是很好奇,也许SO上的某人知道答案,可以在我无法运行之前提供答案。实验。


慕码人8056858
浏览 806回答 3
3回答

侃侃无极

号System.exit(0)不返回,并且不执行finally块。System.exit(int)可以扔一个SecurityException。如果发生这种情况,将执行finally块。并且由于相同的主体从相同的代码库调用相同的方法SecurityException,因此第二次调用可能会抛出另一个。这是第二种情况的示例:import java.security.Permission;public class Main{  public static void main(String... argv)    throws Exception  {    System.setSecurityManager(new SecurityManager() {      @Override      public void checkPermission(Permission perm)      {        /* Allow everything else. */      }      @Override      public void checkExit(int status)      {        /* Don't allow exit with any status code. */        throw new SecurityException();      }    });    System.err.println("I'm dying!");    try {      System.exit(0);    } finally {      System.err.println("I'm not dead yet!");      System.exit(1);    }  }}

守候你守候我

简单的测试,包括catch太透露,如果system.exit(0)没有抛出安全异常,这将是最后一个执行的语句(catch和finally所有不执行)。如果system.exit(0)不抛出一个安全异常,catch和finally语句执行。如果catch和finally都包含system.exit()语句,则仅system.exit()执行这些语句之前的语句。在上述两种情况下,如果try代码属于另一个方法调用的方法,则被调用的方法不会返回。此处有更多详细信息(个人博客)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java