除了对类似的异常类型进行分组之外,在一个catch块中处理多个异常而不是使用基类Exception类处理它有什么其他优点?
为什么选择这个:
try{
//some code
}
catch(FileNotFoundException e1 | IOException e2){
}
对此(这不那么冗长):
try{
//some code
}
catch(Exception e){
}
答案 0 :(得分:3)
捕获泛型异常还将捕获NullPointerException,IndexOutOfBoundsException以及您通常不想捕获的其他异常。通过捕获您想要处理的特定异常,您可以避免这些情况。
答案 1 :(得分:0)
这两段代码并不等同。
第一个只捕获FileNotFoundException
,IOException
及其子类 1 。
第二个捕获上述PLUS所有其他已检查的异常和所有未经检查的异常(除了Error
及其子类)。所以:
您将捕获一大堆异常,通常是编程错误的结果;例如空指针,索引问题等等。
你是有效的"关闭"已检查的异常机制,如果您忘记处理某些已检查的异常,它将给您一个编译时错误;例如SQLException
。现在此时您的代码可能不会抛出任何已检查的异常,而不是您正在捕获的异常(在版本#1中)。但是,如果您修改代码以调用某些方法(例如)throws SQLException
:
所以,回答你的问题......
为什么更喜欢[版本#1] ...而不是[版本#2](这不那么详细):
你应该更喜欢那个正确的那个,而不是那个不那么冗长的那个。第二个版本将捕获您(可能)不打算被捕获的异常,这使得它不正确。
首选版本#1。
1 - 请注意FileNotFoundException
是IOException
的子类,因此您可以重写版本#1以仅捕获IOException
。如果"冗长"是你的主要焦点,然后捕捉IOException
和FileNotFoundException
是详细的。功能
答案 2 :(得分:0)
除了在异常处理中提高效率和效率之外,您还有很多方法可以做到这一点。另外请记住,当您根据自己尝试使用某些内容(例如
)进行大项目或小项目的工作时try{
}(catch Exception e);
在使用加密的程序(例如)上,您会收到大量错误,例如
NoSuchAlgorithmException
InvalidKeyException
还有更多,因为基础异常无法处理它们。
当你使用编译器时,每个编译器都不同......但总的来说,它们都会给你一些形式的警告,基本上告诉你"嘿异常e不会处理这个"
你也会发现你有能力做这样的事情。
public setStringExample(string example) throws IOException, Exception, NullPointerExcetptiopn {
}
Java在很多方面迫使你去解决大多数事情,这些事情并不是一件坏事我想大声笑..
TL; DR我试图做的总体观点是,应该正确有效地完成异常处理,这是随着时间的推移而学习的,不要试图抓住一些不是他们的东西并且不要试图避免捕捉可能会发生的事情!