Java 无参数构造函数 : Throw impossible exception, 或有空 catch block ?

标签 java exception constructor

无参数构造函数抛出一个不可能的异常或有一个空的 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/

相关文章:

java - Java 中使用拆分和聚合的并行作业执行

java - spring批处理-作业执行id?

java - 如何在 Java 中获取特定类型的异常

c# - 发生类型为 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 的第一次机会异常

c++ - 谷歌模拟 : "no appropriate default constructor available"?

c# - 如何使用 IKVM 构建 .net 库?

java - 在没有 Firefox 的情况下编辑 Firefox 首选项

java - SonarQube 提示 : Either log or rethrow this exception

c++ - 构造函数初始化列表与在头文件中初始化

c++ - 从文件读取错误(读取 0 或 ""值)