gpt4 book ai didi

java - "precise rethrow with a final exception"在 Java SE 8 中工作吗?

转载 作者:行者123 更新时间:2023-12-01 22:17:04 25 4
gpt4 key购买 nike

public class TestException extends except2 {

public static void main(String[] args)throws Exception {
try {
try {
throw new TestException();
}
catch (final TestException e){
}
throw new except2();
}
catch (TestException a){
}
catch (Exception e){
throw e;
}
}

public TestException(){
}
}

class except2 extends Exception{
}

大家好,

我的JDK版本是8u45,这是现在最新的版本。

我想知道“精确重新抛出最终异常”在 SE 8 中仍然有效吗?

如代码所示,如​​果我去掉“抛出异常”,则会出现编译错误,但根据SE7的“精确重新抛出最终异常”功能,应该可以忽略它。

另一个问题是,我们都知道如果嵌套的 try 框中发生了异常,我们仍然应该将其抛出到外部的 catch 框以避免编译错误,我本来认为我们只需要抛出任何类型的异常即可& 就可以了,我的测试结果也是如此,我想这是为了让编译器知道 try 框和 catch 框也有异常。

但是如果我像下面的代码一样更改它:

public class TestException extends except2 {
public static void main(String[] args)throws Exception {
try {
try {
throw new ArithmeticException();
} catch (final TestException e){
throw e;
}
} catch (TestException a){
} catch (Exception e){
throw e;
}
}
}

(final TestException e) 部分将出现编译错误,并显示以下消息:

“相应的 try block 中永远不会抛出异常“com.xxx.TestException””,

我很困惑,因为如果嵌套的 catch block 无法处理异常,它应该转到外部。

然后,如果我在外部 try block 的末尾抛出一个 ArithmeticException ,如下所示:

try {
try {
throw new TestException();
}
catch (final TestException e){
System.out.println("d");
}

throw new ArithmeticException();
}
catch (TestException a){
}
catch (Exception e){
throw e;
}

与外部捕获框相同的错误catch (TestException a){}

这是为什么?

它应该被(Exception e) block 捕获。

如果我不能抛出与嵌套 try block 的第一个异常不同类型的异常,为什么我可以在代码的第一段中抛出 except2 ?

最佳答案

这是该功能的 Oracle 示例,它仍然适用于 Java 8:

static class FirstException extends Exception { }
static class SecondException extends Exception { }

public void rethrowException(String exceptionName)
throws FirstExceptio, SecondException // Since J7 no "Exception" needed
{
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e; // effective final (i.e. not assigned)
}
}

这在本Oracle document的后半部分中有描述。 。你的例子都与它没有真正的关系。尤其是在你有更具体和一般的捕获的情况下。文档中明确提到这不起作用。

如果您使用 except2 (我将其重命名为 BaseException),您的第一个 block 将起作用,这是更具体的,如下所示:

public class TestException extends BaseException {

public static void main(String[] args) {
try {
try {
throw new TestException();
}
catch (final BaseException e){
throw e; // this is defined as BaseEx, will fail on Java 6
}
}
catch (TestException a){ // this knows that no BaseEx is expected
}
}

public TestException(){
}
}

class BaseException extends Exception { }

如您所见,main() 方法不再需要抛出异常,因为第二个 catch block 就足够了。

关于java - "precise rethrow with a final exception"在 Java SE 8 中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30763172/

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