我知道自Java 7以来你可以使用multi-catch
但是我想知道它的异常顺序是否与之前版本的java一样重要?例如,我放入了例外,然后是SQLException
和IOException
?
try {
// execute code that may throw 1 of the 3 exceptions below.
} catch(Exception | SQLException | IOException e) {
logger.log(e);
}
或者我应该这样做?
try {
// execute code that may throw 1 of the 3 exceptions below.
} catch(SQLException | IOException e) {
logger.log(e);
} catch(Exception e) {
logger.severe(e);
}
答案 0 :(得分:5)
catch(Exception | SQLException | IOException e)
的单个catch块没有任何意义,因为Exception
已涵盖其子类IOException
和SQLException
。
因此,如果您希望对所有这些异常类型进行相同的处理,catch(Exception e)
就足够了。
如果你想对更通用的Exception
进行不同的处理,那么你的第二个代码片段是有意义的,这里两个catch块的顺序很重要,因为你必须首先捕获更具体的异常类型。
答案 1 :(得分:2)
是订单很重要,它是从儿童到家长。
请参阅this了解更多信息。
异常变量是隐式最终的,因此我们无法分配 catch块中的变量到不同的值。例如, 以下代码片段将给出编译错误
} catch (IOException | SQLException ex) {
ex = new SQLException();
}
编译器将抛出此错误:可能未分配多捕获参数ex
不允许指定两个或更多相同的例外 multi-catch语句中的层次结构。例如,以下内容 代码片段会产生编译错误,因为 FileNotFoundException是IOException的子类型
} catch (FileNotFoundException | IOException ex) {
LOGGER.log(ex);
}
编译器将抛出此错误(无论顺序是什么):multi-catch语句中的替代项无法通过子类化来关联
Exception类是所有异常的超类型,因此我们也是 不能写
} catch (IOException | Exception ex) {
LOGGER.log(ex);
}
答案 2 :(得分:1)
java中提供了多捕获功能,用于删除两个不同分层异常中的代码重复。如果您因此使用它,则排序无关紧要。如果要在多捕获块中捕获父异常类Exception
,则无需添加子异常IOException, SQLException
类。
答案 3 :(得分:0)
顺序很重要,因为如果你首先尝试捕获Exception,而你的第二个捕获是IOException,显然你永远不会遇到第二次捕获。所以订单必须是从最小的Exception到最大的。
答案 4 :(得分:0)
例外有一些层次结构。 Exception e
比其他人更客观,因此,它应该是您处理的最后一个例外。
IOException
和SQLException
之间没有比较,因此,您可以随意处理它们。
所以,顺序应该是:
try {
// execute code that may throw 1 of the 3 exceptions below.
} catch(SQLException | IOException e) {
logger.log(e);
} catch(Exception e) {
logger.severe(e);
}
或
try {
// execute code that may throw 1 of the 3 exceptions below.
} catch(SQLException e) {
logger.log(e);
} catch(IOException e){
logger.log(e);
} catch(Exception e) {
logger.severe(e);
}
或
try {
// execute code that may throw 1 of the 3 exceptions below.
} catch(IOException e) {
logger.log(e);
} catch(SQLException e){
logger.log(e);
} catch(Exception e) {
logger.severe(e);
}