在Java中,为什么要在catch块中指定异常类型?

在Java中,为什么要在catch块中指定异常类型?,java,exception,try-catch,Java,Exception,Try Catch,我一直在用Java编写代码,但我所知道的关于Java的一切都来自于在需要的时候用谷歌搜索如何做任何事情。我以前在学校做过C/C++,现在我刚刚开始学习Java中的异常处理 在Java中,为什么要在catch块中指定异常类型?这样做有什么好处?使用异常而不是说“IOException”有哪些缺点 另外,在编码时,何时应该使用try/catch块?我注意到我进入了只对逻辑部分进行编码的模式,我只在编码时显示错误并告诉我添加时添加try/catch,或者当我运行代码并且程序由于异常中途退出时,我会在代

我一直在用Java编写代码,但我所知道的关于Java的一切都来自于在需要的时候用谷歌搜索如何做任何事情。我以前在学校做过C/C++,现在我刚刚开始学习Java中的异常处理

在Java中,为什么要在catch块中指定异常类型?这样做有什么好处?使用异常而不是说“IOException”有哪些缺点

另外,在编码时,何时应该使用try/catch块?我注意到我进入了只对逻辑部分进行编码的模式,我只在编码时显示错误并告诉我添加时添加try/catch,或者当我运行代码并且程序由于异常中途退出时,我会在代码中找到它发生的位置并在那里添加try/catch块以“处理异常”为了让代码继续运行。这就是人们通常决定在哪里添加try/catch的方式吗?是否有更有效的方法,例如“在代码中执行某些操作时,添加try/catch”

非常感谢

编辑:
何时应该使用try/catch块,何时应该使用
private void method()抛出异常
?除了语法之外,这两者有什么区别

我可能遗漏了我不熟悉的细节。但据我所知,通过指定特定的异常类型,可以在日志中获得有关错误的更详细信息

此外,当使用try/catch块“合适”时,eclipse和其他ide通常会显示一条警告


希望它在某种程度上回答了这个问题

指定捕获哪些异常是相当直截了当的。要记住的主要一点是,异常是类,并且具有继承层次结构。例如,IOException继承自Exception。这允许您捕获不同的异常,并以不同的方式处理它们

try {
 ....
} catch (IOException e){
    logger.fatal("An IO Exception occurred.");
} catch (NullPointerException e){
    logger.info("A null pointer exception occurred.");
} 
在上面的示例中,IO异常将被记录为致命异常,但空指针仅记录在信息级别。除了这两个异常之外,任何可能抛出的异常都不会被捕获,并将被抛出到下一个错误处理级别。这可能会使程序崩溃,或者调用链上更高的方法可能会处理抛出的异常

try {
 ....
} catch (IOException e){
    logger.fatal("An IO Exception occurred.");
} catch (NullPointerException e){
    logger.info("A null pointer exception occurred.");
} catch (Exception e) {
    logger.fatal("An unexpected exception occurred.");
}
在第二个示例中,捕获所有异常。但只会执行一个catch块(匹配的第一个)

编写代码时进行计划的一个好方法是: 1) 确定这行代码是否会失败。(IO、解析文本、调用服务…)。
2) 如果此代码失败,我希望在此处(使用catch块)或稍后通过在调用链上引发异常来处理此失败。

在大多数情况下,您应该指定异常的类型,因为您调用的方法可能引发不同类型的异常。例如,假设您试图访问文件系统中的一个文件,当您调用该方法执行此操作时,该方法可以抛出一个
FileNotFoundException
,正如名称所述,当您提供的文件路径不存在时,您将得到该异常。如果文件确实存在,该方法还可以抛出一个
IOException
,但IO设备或文件本身存在一些其他问题。

通常,您希望知道这两个错误之间的区别并采取相应的行动,在这种情况下,您必须放置两个
捕获
e,一个用于
FileNotFoundException
,另一个用于
IOException


如果出于某种原因,您不关心特定的错误,那么您只需为常规的
异常添加一个
catch



对于您的其他问题的答案,您可以在这里找到它们

许多相对较新的程序员认为所有异常都是不好的,但这不是真的。例外既不好也不坏。他们只是提供信息

采取
nullpointereexceptions
vs
FileNotFoundExceptions

通常(并非总是),如果抛出
NullPointerException
,则表示代码中的某个地方存在错误。您忘记初始化变量,没有检查标志是否为真,等等。当抛出这些异常时,您通常希望程序失败并崩溃,因为它遇到意外行为。您希望失败是响亮而明显的,因为如果程序没有在空指针后立即失败,程序可能会变得非常古怪,您将很难找到问题

然而,
FileNotFoundExceptions
通常是相反的

想象一下,如果在程序中的某个时刻,您提示用户输入一个文件。用户可以输入有效的文件,也可以不输入有效的文件,但是程序不应该以任何方式在这里崩溃。相反,如果找不到文件,应通知用户,并再次提示。这就是为什么您有catch块,所以如果抛出异常,您可以处理它并继续(通过显示对话框/消息/任何内容)

但是,如果在这里抛出
NullPointerException
,您肯定希望程序崩溃(因为它可能是代码中的一个bug)。这就是为什么catch块强制您指定异常,以便您可以处理某些异常(例如
FileNotFoundException
),并允许其他异常通过(例如
NullPointerException


通常,如果您的程序能够从异常中恢复,您希望捕获异常。这就是java强迫您尝试/捕获某些异常的原因。这些异常中的大多数都是您的程序应该能够从中恢复的异常(尽管有时,您可能希望通过声明您的方法引发该异常,或者将捕获的异常包装在
RuntimeException
)中而失败)。您希望异常处理程序尽可能具体。原因是