gpt4 book ai didi

java - block 捕获中的丢失异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:22 24 4
gpt4 key购买 nike

我运行这段代码:

public class User {

public static void main(String args[]) {
int array[] = new int[10];
int i = 1;
try {
System.out.println("try: " + i++);
System.out.println(array[10]);
System.out.println("try");
} catch (Exception e) {
System.out.println("catch: " + i++);
System.out.println(array[10]);
System.out.println("catch");
} finally {
System.out.println("finally: " + i++);
Object o = null;
o.hashCode();
System.out.println("finally");
}

}
}

Result:
try: 1
catch: 2
finally: 3
Exception in thread "main" java.lang.NullPointerException at user.main(User.java:17)

在 block 中捕获 - ArrayIndexOutOfBoundsException,但我们丢失了这个异常,为什么?

最佳答案

来自 JLS

您可以在 JLS 中阅读相关信息,Blocks and Statements ,“14.19.2 try-catch-finally 的执行”部分。我引用,

If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
  • If the finally block completes normally, then the try statement completes abruptly for reason R.
  • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded). The example...

因此,以下内容(实际上是从提问者的代码中浓缩而来)以 NPE 结束,而不是抛出 ExceptionTest

class Phinally
{
static class ExceptionTest extends Exception
{ public ExceptionTest(String message) { super(message); } }

public static void main(String[] args) throws ExceptionTest
{
try {
System.out.println("Foo.");
throw new ExceptionTest("throw from try");
} finally {
throw new NullPointerException("throw from finally");
}
}
}

关于 try 资源/ARM block 的边栏

在一些常见的情况下,特别是管理资源,需要嵌套的 try/catch/finally block ,并嵌套在内部,很难对此进行推理finally block ,是项目 COIN 中“尝试使用资源”功能(“很快”集成到 Java 中)的部分原因,您可以阅读 more about here .

这是花时间运行像 PMD 这样的静态分析器的众多好理由之一。 ,它找到和 complains about this type of confusion - 虽然它可能无法在您的代码中捕捉到这种情况,但我不确定。

静态检查

跟进@stacktrace 的评论:我通过 PMD 和 FindBugs 运行了相关代码, 尝试以下两种方法:

finally { throw NullPointerException("Foo"); }

finally { Object o = null; System.out.println(o.toString()); }

对于前者,PMD 注意到并提示从 finally 子句中抛出异常。 FindBugs 一点也不提示。对于后者,PMD 提示了几件事但没有任何相关(“LocalVariableCouldBeFinal”、“StringToString”和“UselessOperationOnImmutable”)。但是,FindBugs 注意到并提示了一个 null 取消引用。故事的道德启示?同时运行 PMD 和 FindBugs!

相关

与 SO 相关:Swallowing exception thrown in catch/finally . Can I avoid such cumbersome try/catch/finally...

关于java - block 捕获中的丢失异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com