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

时间:2014-06-20 21:45:08

标签: java exception try-catch

我一直在用Java编写工作代码,但我所知道的关于Java的一切都来自Google搜索如何在我需要知道时做任何事情。我以前在学校做过C / C ++,现在我只是在Java中进行异常处理。

在Java中,我们为什么要在catch块中指定异常类型?这样做有什么好处?使用Exception而不是,例如" IOException"?

有什么缺点

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

非常感谢!

编辑: 我应该何时使用try / catch块,何时应该使用private void method() throws Exception?除了语法之外,两者之间的区别是什么?

4 个答案:

答案 0 :(得分:2)

许多相对较新的程序员都认为所有异常都很糟糕,但事实并非如此。例外既不好也不坏。他们只是提供信息。

NullPointerExceptions vs FileNotFoundExceptions

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

然而,FileNotFoundExceptions通常是相反的。

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

但是,如果在此处抛出NullPointerException,您肯定希望程序崩溃(因为它可能是您代码中的错误)。这就是catch块强制你指定Exception的原因,所以你可以处理一些(例如FileNotFoundException),让其他人通过(例如NullPointerException

通常,如果程序能够从该异常中恢复,则希望捕获异常。这是(应该是)为什么java强迫你try/catch某些例外。这些异常中的大多数都是程序应该能够恢复的异常(尽管有时,您可能希望失败,或者通过声明您的方法抛出该异常,或者将捕获的异常包装在RuntimeException中)。

答案 1 :(得分:0)

我可能会遗漏我不了解自己的细节。但据我所知,指定特定的异常类型,允许您获取有关日志中错误的更详细信息。

eclipse和其他ide通常会在它正确的时候显示出警告"使用try / catch块。

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

答案 2 :(得分:0)

指定要捕获的异常是非常简单的。要记住的主要事情是异常是类,并具有继承层次结构。例如,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块)或更高版本。

答案 3 :(得分:-1)

在大多数情况下,您应该指定异常的类型,因为您调用的方法可能会抛出不同类型的异常。例如,假设您正在尝试访问文件系统中的文件,当您调用方法执行此操作时,该方法可以抛出FileNotFoundException,如名称所述,您将获得文件路径你给它它不存在。如果文件存在,该方法也可以抛出IOException,但IO设备或文件本身存在其他问题。

通常,您希望了解这两个错误之间的差异并采取相应措施,在这种情况下,您必须为catch放置两个FileNotFoundException es,为IOException放置另一个catch

如果由于某种原因您不关心特定错误,那么您只需为常规Exception添加一个{{1}}。

有关其他问题的答案,可以在http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

找到