无参数构造函数抛出一个不可能的异常或有一个空的 catch block 更好吗?假设我有这样的类(class)。
public class Foo {
private int num;
private String numString;
public Foo() throws NumberFormatException {
setNum("1");
}
public void setNum(String s) throws NumberFormatException {
// In reality, complex code goes here
num = Integer.parseInt(s);
numString = s;
}
}
编译器强制构造函数抛出 NumberFormatException(这永远不会发生)或者有一个 try/catch block 。但是,拥有一个通常不受欢迎的空 catch block 是否正确?
public Foo() {
try {
setNum("1");
}
catch (NumberFormatException e) { }
}
请注意,Foo 将是一个库类,其他人会使用它,因此让一个无参数的构造函数抛出一个不可能的异常会令人困惑。另请注意,真正的异常是自定义异常,而不是 NumberFormatException,这可能会使库用户更加困惑,他们可能会觉得在没有必要时必须阅读自定义异常。
最佳答案
NumberFormatException
是一个 RuntimeException
,因此您无需将其列在您的 throws
子句中——只需假装它不存在即可。这适用于方法和构造函数。
RuntimeException
的任何子类(包括 RuntimeException
本身)都是“未经检查的异常”,这意味着编译器不会强制您在 try/捕捉子句。相反,任何不是 RuntimeException
子类的 Exception
都可以很容易地称为已检查异常。
如果它是已检查的异常(也就是说,不是 RuntimeException
的子类),但您确定永远不会触发它,那么它会是安全地捕获它。与其完全吞下它,不如将其包装在一个未经检查的异常周围。
try {
thisCodeCanNeverThrowAnIOException();
}
catch (IOException e) {
throw new AssertionError(e); // juuust in case!
}
现在您的代码可以编译,没有用于您从未想过会抛出的异常的 throws
子句,但如果由于某些错误或 future 的更改,则不会隐藏严重错误异常最终会被抛出。
(阅读评论的人请注意:我最初在代码示例中有 throw new RuntimeException(e)
,但 Stephen C 和 Peter Lawrey 指出,在 Java 1.4.2 和更新版本中, AssertionError 更好)。
关于Java 无参数构造函数 : Throw impossible exception, 或有空 catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458838/