2016-11-20 117 views
0

什么是在catch块捕获异常

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

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

假设之间的区别我有一个NullPointerException,哪一个是最好的?为什么?

+0

'Exception'是非常普遍的,'NullPointerException'是特定于'null'对象的,你试图获取属性或访问方法。最好'catch'你的特定异常(在'NullPointerException'的情况下),否则你可能会隐藏你的代码中的一些问题,在捕获一般异常时应该修复这些问题。 – Tom

回答

2

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

答:前者是特定的,后者是一般的。

有时候您想以某种方式处理特定类别的异常(如“NullPointerException”),但有不同的异常类别(如“IOException”)。

一般来说,您应该选择尽可能处理“最窄”的异常,而不是“处理所有事情”。

“NullPointerException”(和“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

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

在任何情况下,对于NullPointerException s都需要catch子句是非常罕见的,因为您可以简单地通过代码中的空检查来避免它们(只有在代码中生成NullPointerException时才需要catch子句你不能控制,例如在图书馆的内部)。

从Java 7开始,你甚至可以这样做:

try { 
    ... 
} catch (NullPointerException | AnotherException e) { 
    ... 
} 

避免复制同一机构不同Exception类。

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

相关问题