java为什么在捕获异常时顺序很重要?
我必须用一些代码来回答这个问题:
Suppose I wrote the following method specification:
public void manipulateData ( ) throws java.sql.SQLException, java.sql.SQLDataException
You are writing code for a database program that will use this method and you want to handle each specifically. What should the try/catch clause look like?
You can use no-ops-- empty blocks {}--for the catch clause contents.
We are only interested in the syntax and structure of the statements here.
我回答说:
try {
} catch(java.sql.SQLException e) {
}
catch(java.sql.SQLDataException e) {
}
出于以下原因,他没有接受答案:
“你的catch子句顺序不对。你能解释一下为什么顺序很重要吗?”
他的回答正确吗
# 1 楼答案
想想异常的继承层次:
SQLDataException extends SQLException
因此,如果您首先捕获“泛型”的一个(即层次结构中最顶层的基类),那么“下面”的每一个事物都是相同类型的,因为多态性,即SQLDataExceptionisa
SQLException因此,您应该以自底向上的顺序捕获它们,即继承层次结构,即子类首先到达(泛型)基类。这是因为
catch
子句是按照您声明的顺序计算的# 2 楼答案
是的,他是对的。正如你在Javadoc中看到的,
SQLDataException
是SQLException
的一个子类。因此,您的答案是错误的,因为它会在第二个catch
中创建一个无法访问的代码块在Java中,这些代码甚至不会编译。在其他语言(例如python)中,这样的代码会产生一个微妙的bug,因为
SQLDataException
实际上会在第一个块中被捕获,而不是在第二个块中(如果它不是子类,情况就是这样)如果你回答了^{,它仍然是不正确的,因为这个问题要求具体处理每个异常
正确答案在Grijesh's answer