为什么在捕获异常时顺序很重要?

2022-09-01 19:43:17

我不得不用一些代码来回答这个问题:

假设我写了以下方法规范:
public void manipulationData ( ) throw java.sql.SQLException, java.sql.SQLDataException

您正在为将使用此方法的数据库程序编写代码,并且希望专门处理每个代码。try/catch 子句应该是什么样子?
您可以使用 no-ops-- 空块 {}-- 作为 catch 子句内容。
我们只对此处语句的语法和结构感兴趣。

我是这样回答的:

try {

} catch(java.sql.SQLException e) {

}
catch(java.sql.SQLDataException e) {

}

他没有接受这个问题的答案,理由是这样的:

“你的捕获条款的顺序错误。您能解释一下为什么订单很重要吗?

他的答案正确吗?


答案 1

是的,他是对的。正如您在 Javadoc 中看到的,是 的子类。因此,您的答案是错误的,因为它会在第二个 .SQLDataExceptionSQLExceptioncatch

在Java中,这段代码甚至无法编译。在其他语言(例如python)中,这样的代码会创建一个微妙的错误,因为实际上会被捕获在第一个块中,而不是在第二个块中(如果它不是子类,情况就是如此)。SQLDataException

如果您回答了 ,它仍然是不正确的,因为问题要求专门处理每个异常。catch(java.sql.SQLException | java.sql.SQLDataException e) { }

正确的答案在格里耶什的答案


答案 2

在Java中,你必须把包容性最小的异常放在第一位。下一个例外必须更具包容性(当它们相关时)。

例如:如果您将包含性最强的(异常)放在第一位,则永远不会调用下一个。代码是这样的:

try {
     System.out.println("Trying to prove a point");
     throw new java.sql.SqlDataException("Where will I show up?");
}catch(Exception e){
     System.out.println("First catch");
} catch(java.sql.SQLException e) {
     System.out.println("Second catch");
}
catch(java.sql.SQLDataException e) {
     System.out.println("Third catch");
}

永远不会打印您希望它打印的消息。


推荐