如果尝试捕获仅包含特定捕获,是否会抛出异常?

时间:2019-02-09 12:59:33

标签: java exception

关于异常引发,我有一个如下的Java方法

public void wrapException(String input) throws MyBusinessException {

        // do something   

}

MyBusinessException扩展了Exception类,并将任何(每个)异常返回给调用者。我的疑问是,

想象一下,现在我的代码已更改为以一种特殊方式处理一个特定的异常,如下所示。

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
}

方法签名上的 throws 是否仍将除NumberFormatException之外的任何异常返回给调用者,否则我将不得不如下重新设计方法?

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
    catch(Exception e) {
     throws MyBusinessException(e.message());
}
}

赞赏任何见解。

3 个答案:

答案 0 :(得分:0)

catch (NumberFormatException e)将仅捕获NumberFormatException及其任何子类。例如,它不会捕获IllegalArgumentException

如果要处理其他类型的异常,则必须明确捕获它们。

答案 1 :(得分:0)

在您的第一个解决方案中,它将仅捕获类型为NumberFormatException的异常以及从其继承的任何类。

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
}

但是,在以后的解决方案中,由于方法主体中有catch(Exception e),因此您的方法将捕获从Exception类继承的任何异常,包括您自己的MyBusinessException。因此,您不必在方法签名中放入throws MyBusinessException

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
    catch(Exception e) {
     throws MyBusinessException(e.message());
}
}

足够了;

public void wrapException(String input) {
        try {
            // do something
        } catch (NumberFormatException e) {
            throw new MyBusinessException("there was a number error", e);
        }
        catch(Exception e) {
         throws MyBusinessException(e.message());
    }
    }

答案 2 :(得分:0)

首先,我们需要了解“方法签名仍然返回任何异常”抛出,永不返回或抛出任何异常,它只是声明或提示编译器该方法可以抛出异常。仅当方法本身不想处理特殊情况且异常为“已检查”时才需要此声明。即,在“已检查”异常的情况下,编译器会强制您处理(使用catch)或使用throws关键字声明异常。如果我们使用throws声明它,则相同的强制将适用于调用方方法。当方法中引发任何异常并且该异常未捕获在该方法中时,该异常将始终引发给调用方方法。 即

int divideByZero(int n){
 return n/0;
}
即使我们没有用throws声明,

也会抛出ArithmeticException。 (因为这是“未检查”,所以意味着编译器不会针对“未检查”异常强制执行声明或捕获规则。)

因此,在您的情况下,第二次捕获不是强制性的,而是一种选择。