在catch块中捕获异常

时间:2016-11-20 08:29:23

标签: java exception-handling

之间有什么区别
try {
    ...
} catch (Nullpointerexception e) { ... }
} catch (Exception e) { ... }

try {
    ...
} catch (Exception e) { ... }

假设我有NullPointerException,哪一个最好?为什么?

2 个答案:

答案 0 :(得分:2)

问:catch(Nullpointerexception e)catch(Exception e)之间有什么区别?

答:前者是具体的,后者是一般的。

有时候你想要处理特定类别的异常(例如" NullPointerException"),但是不同类别的异常(例如" IOException")会有所不同。

一般来说,你应该选择处理最窄的"可能的例外,而不是"处理所有事情"。

" NullPointerException"之间的另一个显着差异(和#34; ArrayIndexOutOfBound")与许多其他异常相比,NullPointerException是unchecked异常。

另请注意,在Java 7中,您可以在同一个catch块中捕获多个不同的异常:

Catching Multiple Exceptions in Java 7

// Pre-Java 7 code:
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);
}

但现在......

// Java 7 and higher
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);
}

答案 1 :(得分:1)

如果处理Exception的代码总是相同的话,你应该使用第二个选项,如果你想要不同的Exception的不同行为,你应该使用第一个选项。

在任何情况下,很少需要NullPointerException的catch子句,因为你可以在代码中使用null检查来避免它们(只有当{{你才真正需要一个catch子句] 1}}是在您无法控制的代码中生成的,例如在库的内部。)

从Java 7开始,您甚至可以:

NullPointerException

避免为不同的try { ... } catch (NullPointerException | AnotherException e) { ... } 类复制相同的主体。

在Java 7之前,您必须在方法中包含Exception处理代码,并从多个catch子句调用if以避免其复制。