有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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子句顺序不对。你能解释一下为什么顺序很重要吗?”

他的回答正确吗


共 (2) 个答案

  1. # 1 楼答案

    想想异常的继承层次:SQLDataException extends SQLException因此,如果您首先捕获“泛型”的一个(即层次结构中最顶层的基类),那么“下面”的每一个事物都是相同类型的,因为多态性,即SQLDataExceptionisaSQLException

    因此,您应该以自底向上的顺序捕获它们,即继承层次结构,即子类首先到达(泛型)基类。这是因为catch子句是按照您声明的顺序计算的

  2. # 2 楼答案

    是的,他是对的。正如你在Javadoc中看到的,SQLDataExceptionSQLException的一个子类。因此,您的答案是错误的,因为它会在第二个catch中创建一个无法访问的代码块

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

    如果你回答了^{,它仍然是不正确的,因为这个问题要求具体处理每个异常

    正确答案在Grijesh's answer