采取这段代码:
try
{
FileReader f=new FileReader("D:/sda.t");
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(Exception f)
{
f.printStackTrace();
}
我们为什么要遵循这种方法?
为什么我们不只使用异常对象来捕获所有异常,而不是去处理特定的异常?
因为您想以不同的方式处理每个异常,而不是全部相同地处理它们?
为什么Catch(Exception)几乎总是一个坏主意的可能重复?
复制为什么捕获异常时顺序很重要?
正如其他人所说,捕获所有Exception是一个坏主意,因为通常您想以不同的方式处理它们。
尽管您还需要注意,捕获Exception也会捕获所有RuntimException,而您通常不希望捕获它们。这些包括NullPointerException之类的东西。
如果未捕获RuntimeException,则程序将在到达它后立即死亡,并且会通知您;如果您捕获Exception,却忘记处理任何显示异常的内容,那么您将错过RuntimeException s,表示程序员错误。
Why do we follow this approach?
Why don't we just use Exception objection to catch all exceptions rather going for specific ones?
很简单,当您希望在发生特定异常时执行特定任务时,可以执行此操作。
3个原因:
分离错误处理代码。
为了能够将错误报告传播到方法的调用堆栈中。
分组和确定错误类型。
查看文档以及此答案。
因为在实际可能发生的特定异常情况下,您将以不同的方式处理它。例如,您可能想在获得FileNotFoundException时创建文件。
如果像您提供的示例中那样从宽到窄,那么FileNotFoundException将永远不会被捕获,因为首先使用宽的Exception。这么宽到窄是没有用的。
在java7或更高版本中,您可以使用multicatch语句:
catch(SQLException | IOException e) {
logger.log(e);
}
如果您对异常所做的唯一事情是printStackTrace(),则没有任何意义。关键是不同的处理代码可以与不同的异常相关联,并且按照指定的顺序(使用"仅优先匹配"选择机制)将抛出的异常与捕获列表进行匹配。