gpt4 book ai didi

java - 为什么 try..finally 阻止不将原始异常注册为抑制?

转载 作者:IT老高 更新时间:2023-10-28 21:01:37 26 4
gpt4 key购买 nike

使用以下代码:

try {
throw new RuntimeException ("main");
}
finally {
throw new RuntimeException ("finally");
}

我得到这个结果:

Exception in thread "main" java.lang.RuntimeException: finally
at test.main(test.java:12)

但是,随着 Java 7 中添加了抑制异常,当 finally block 本身因异常而失败时,该语言将原始“主”异常注册为抑制是否符合逻辑?目前我必须手动模拟这个:

try {
throw new RuntimeException ("main");
}
catch (RuntimeException exception) {
try {
throw new RuntimeException ("finally");
}
catch (RuntimeException exception2) {
exception2.addSuppressed (exception);
throw exception2;
}
}

获得更有用(用于了解正在发生的事情)的结果:

Exception in thread "main" java.lang.RuntimeException: finally
at test.main(test.java:13)
Suppressed: java.lang.RuntimeException: main
at test.main(test.java:9)

编辑:澄清我想知道的。当前的 Java 版本是 8,抑制异常不是一个全新的特性。但是 try..finally 仍然没有合并它们。有什么东西可以防止这种情况发生吗?

最佳答案

因为 try-with-resources 是语法糖,Java 编译器不会以同样的方式扩展常规的 try-finally block 。

看看下面的代码:

try(FileInputStream fstream = new FileInputStream("test")) {
fstream.read();
}

编译然后反编译(使用 IntelliJ IDEA)时,它看起来像这样:

FileInputStream fstream = new FileInputStream("test");
Throwable var2 = null;

try {
fstream.read();
} catch (Throwable var19) {
var2 = var19;
throw var19;
} finally {
if(fstream != null) {
if(var2 != null) {
try {
fstream.close();
} catch (Throwable var17) {
var2.addSuppressed(var17);
}
} else {
fstream.close();
}
}
}

而这段代码:

FileInputStream fstream = new FileInputStream("test");
try {
fstream.read();
} finally {
fstream.close();
}

编译和反编译时看起来完全一样。

现在,可以肯定的是,所有 finally block 都应该以与上述相同的方式展开,但由于某种原因,要么被忽视,要么被决定反对。

我建议你open a feature request因为我认为这是一个明智的功能。

关于java - 为什么 try..finally 阻止不将原始异常注册为抑制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934141/

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