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

2022-08-31 11:38:24

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

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

try {
    //Code
    System.exit(0)
}
catch (Exception ex) {
    //Log the exception
}
finally {
    System.exit(1)
}

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

代码处于一个极端情况下,很难(如果不是不可能)重现,所以我不能编写单元测试。如果我有几分钟空闲时间,我将尝试在今天晚些时候运行一个实验,但我还是很好奇,也许SO上的某个人知道答案,并且可以在我无法运行实验之前或万一我无法运行实验的情况下提供它。


答案 1

不。 不返回,并且不执行最终块。System.exit(0)

System.exit(int)可以抛出一个.如果发生这种情况,将执行最终的块。由于同一主体从相同的代码库调用相同的方法,因此可能会从第二次调用中引发另一个方法。SecurityExceptionSecurityException


下面是第二种情况的示例:

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);
    }
  }

}

答案 2

简单的测试包括太表明,如果不引发安全异常,它将是最后执行的语句(并且根本不执行)。catchsystem.exit(0)catchfinally

if 会引发安全异常,并执行语句。如果两者都包含 语句,则仅执行这些语句前面的语句。system.exit(0)catchfinallycatchfinallysystem.exit()system.exit()

在上面描述的两种情况下,如果代码属于由另一个方法调用的方法,则被调用的方法不会返回。try

更多详细信息请点击此处(个人博客)。


推荐