【问题标题】:Exceptions and errors report order异常和错误报告顺序
【发布时间】:2011-11-23 17:50:56
【问题描述】:

哪些规则适用于以下代码:

    try {
        assert (false) : "jane";
    } catch (Exception e2) {
        System.out.print("ae2 ");
    } finally {
        throw new IllegalArgumentException();
    }

资产已启用。

为什么会报告 IllegalArgumentException 而不是 AssertionError?是否有适用于这种情况的规则?

编辑: 对不起!在这个例子中应该有 assert (false)

【问题讨论】:

    标签: java scjp open-closed-principle


    【解决方案1】:

    finally 块始终运行。 assert 的计算结果为 true,因此 finally 块会引发异常。

    此外,无论如何默认情况下都禁用断言,这可能是断言从未得到评估的原因。

    附言

    如果assert 评估为假,finally 将继续运行并抛出异常,而不是 AssertionError

    请记住,finally 块始终运行,除非 JVM 在 try 块中停止。

    【讨论】:

    • assert 不返回任何内容。
    • 好的,准确地说是评估。
    【解决方案2】:

    finally 块(或catch 块)中的未捕获异常会导致try 块中的任何异常被丢弃。有关详细信息,请参阅Java Language Specification § 14.20。从 Java 7 开始,封闭的 try/catch 块可以恢复丢弃的异常(如 here 所述)。

    【讨论】:

      【解决方案3】:

      唯一能做任何事情的行是

      throw new IllegalArgumentException();
      

      assert true
      

      什么都不做,即使做了也不会被catch(Exception抓到

      【讨论】:

      • 在这种情况下,答案是 finally 总是最后执行并替换除System.exit();之外的任何先前操作
      【解决方案4】:

      finally 块将始终被执行。它不会执行的唯一情况是JVM关闭(即System.exit(-)。)

      你可能会觉得有趣的是,即使你有:

      try { 
          return ...; 
      } 
      finally { 
          ...
      }
      

      finally 块仍然会被执行,并且会在方法退出之前执行

      【讨论】:

      • 感谢您的回答。我第一次在 Stackoverflow 遇到来自 PUT 的人;)
      • 哈,很高兴在这里找到大学同学 ;-) 祝你的 SCJP 好运。
      • 谢谢,我以 95% 的成绩通过了今天的考试;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      相关资源
      最近更新 更多