关于异常引发,我有一个如下的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());
}
}
赞赏任何见解。
答案 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。 (因为这是“未检查”,所以意味着编译器不会针对“未检查”异常强制执行声明或捕获规则。)
因此,在您的情况下,第二次捕获不是强制性的,而是一种选择。