try/catch与throws异常

car*_*los 114 java exception

这些代码语句是否相同?它们之间有什么区别吗?

private void calculateArea() throws Exception {
    ....do something
}
Run Code Online (Sandbox Code Playgroud)
private void calculateArea() {
    try {
        ....do something
    } catch (Exception e) {
        showException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 139

是的,这是一个巨大的差异 - 后者吞下了例外(无可否认地显示它),而第一个将让它传播.(我假设showException不会重新抛出它.)

因此,如果您调用第一个方法并且"执行某些操作"失败,则调用者将必须处理该异常.如果调用第二种方法和"做什么"失败,那么调用者就不会看到一个异常在所有...这通常是一件坏事,除非showException真正处理的异常,无论固定错了,通常确信这calculateArea已经达到了目的.

您可以告诉这点,因为你不能说没有第一种方法要么捕捉Exception自己宣布你的方法可能会抛出它.

  • +1.因为Jon Skeet需要更多的声誉.哦,答案也很好. (17认同)
  • 当你提到"除非它真正处理了例外",这是一个很好的观点.我只是认为我要补充一点,捕捉"异常"本身很少会导致实际异常的智能"处理",这是人们建议你捕获最具体的异常的原因. (11认同)

sam*_*aur 20

第一个throws Exception,所以调用者需要处理Exception.第二个在Exception内部捕获和处理,因此调用者不必进行任何异常处理.

  • 不,两种模式都是必需的.如果您的方法可以处理异常,请使用第二个模式,否则,使用第一个模式通知调用者. (9认同)

Lyl*_*yle 16

是.声明的版本throws Exception将要求调用代码处理异常,而显式处理异常的版本则不需要.

即,简单地说:

performCalculation();
Run Code Online (Sandbox Code Playgroud)

与将处理异常的负担转移给调用者:

try {
    performCalculation();
catch (Exception e) {
    // handle exception
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 6

是的,它们之间存在很大差异.在第一个代码块中,您将异常传递给调用代码.在第二个代码块中,您自己处理它.哪种方法正确完全取决于您正在做什么.在某些情况下,您希望您的代码处理异常(例如,如果找不到文件并且您想要创建它),但在其他情况下,您希望调用代码处理异常(找不到文件)他们需要指定一个新的或创建它.

一般来说,您也不希望捕获一般异常.相反,你只想捕捉特定的,例如FileNotFoundExceptionIOException因为它们可能意味着不同的东西.