为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2019-11-29 14:54:39
我知道头痛涉及在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上的某人知道答案,可以在我无法运行之前提供答案。实验。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

    }

  }


}


查看完整回答
反对 回复 2019-11-29
?
守候你守候我

TA贡献1802条经验 获得超10个赞

简单的测试,包括catch太透露,如果system.exit(0)没有抛出安全异常,这将是最后一个执行的语句(catch和finally所有不执行)。


如果system.exit(0)不抛出一个安全异常,catch和finally语句执行。如果catch和finally都包含system.exit()语句,则仅system.exit()执行这些语句之前的语句。


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


此处有更多详细信息(个人博客)。


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 805 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信