gpt4 book ai didi

java - 需要Java的 "more precise rethrow in exceptions"

转载 作者:行者123 更新时间:2023-11-30 09:59:28 27 4
gpt4 key购买 nike

我无法理解精确重新抛出在 Java 7 及更高版本中的工作原理。正如 https://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7 中指出的那样, 在 Java 7 及更高版本中,我们可以在方法声明中使用 throws 子句,并使用逗号分隔的方法可能抛出的特定异常列表。如果所有这些异常都是一般异常 java.lang.Exception 的子类型,我们将能够在捕获该父类(super class)型的 catch block 中捕获它们中的任何一个,同时让客户端代码(例如调用者方法)以了解实际发生了哪些可能的子类型异常。

最初,我认为为了让客户端代码知道实际发生了哪些异常,我们需要在throws 子句中指定特定异常的列表。尽管如此,在下面的示例中,客户端代码(main() 方法)似乎能够检索该信息,即使我们仅在中指定异常 java.lang.Exception被调用方法的 throws 子句。因此,我的问题是:

为什么下面的代码输出相同,不管runException()方法的throws子句是throws ExceptionA,ExceptionB还是抛出异常 ?

我在 Eclipse 中使用 Oracle JVM-12。提前致谢!

class ExceptionA extends Exception{}
class ExceptionB extends Exception{}

public class RethrowingAndTypeChecking{
public static void runException(char what) throws Exception{
//public static void runException(char what) throws ExceptionA, ExceptionB{
try{
if(what == 'A')
throw new ExceptionA();
else if (what == 'B')
throw new ExceptionB();
}
catch(Exception e){
throw e;
}
}

public static void main (String args[]){
char ch;
for (int i=0;i<2;i++) {
if(i==0) ch='A';
else ch = 'B';

try{
runException(ch);
}
catch(ExceptionA e){
System.out.print("In main(), 'catch(ExceptionA e){}', caught exception: " + e.getClass());
}
catch(ExceptionB e){
System.out.print("In main(), 'catch(ExceptionB e){}', caught exception: " + e.getClass());
}
catch(Exception e){
System.out.print("In main(), 'catch(Exception e){}', caught exception: " + e.getClass());
}
System.out.println();
}
}
}

输出:

In main(), 'catch(ExceptionA e){}', caught exception: class ExceptionA
In main(), 'catch(ExceptionB e){}', caught exception: class ExceptionB

最佳答案

您缺少的是您需要以不同方式处理这些可能的异常的情况。您的代码正在捕获个别异常,但粗略地说,它执行的是相同的操作。

如果您以与处理ExceptionB 的方式截然不同的方式处理ExceptionA,那么捕获广泛的Exception 将不允许您具体来说:

catch(Exception e){
// something unexpected happened
// e could be an ExceptionA problem
// e could be an ExceptionB problem
// e could be any other unchecked exception
}

当输入 catch(Exception e){} block 时,异常几乎可以是任何东西,但您只有一个通用代码块来处理它。

除此之外,如果您调用的方法声明了特定的checked 异常,那么编译器可以帮助您只处理这些异常,从而增加代码的可预测性

try{
runException(ch);
} catch(ExceptionA e){
// code specific to handling ExceptionA problems
} catch(ExceptionB e){
// code specific to handling ExceptionB problems

} catch(ExceptionC e){ //will not compile, because not declared by runException
// code specific to handling ExceptionB problems
}

关于java - 需要Java的 "more precise rethrow in exceptions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58861352/

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