java - 如何在构造函数中避免这种不必要的 throws 语句?

标签 java exception constructor try-catch

所以,我有一个名为 Puzzle 的类,以及它的两个(相关)构造函数。一个构造函数不接受任何参数,另一个构造函数接受一个 int,但也会引发异常。基本思想是这样的:

public class Puzzle {
    // Fields, methods, etc.
    public Puzzle() {
        this(3);
    }

    public Puzzle(int n) throws Exception {
        if (n < 2) throw new Exception();

        // More constructor code
    }
}

当然,这不能编译,因为采用 int 的构造函数会抛出异常,而没有 args 的构造函数不会处理或抛出异常。但是,由于很明显永远不会抛出异常(构造函数体内不再抛出异常),所以这应该不重要。我可以使用一个空白的 try-catch 语句,如下所示:

public Puzzle() {
    try {
        this(3);
    } catch (Exception e) {
        // Never happens
    }
}

这里的问题是对 this(3) 的调用不再是构造函数的第一条语句,因此它无法编译。似乎我必须用 throws 子句标记这个构造函数,即使我知道它永远不会抛出异常。这真的很烦人,因为调用代码将需要有不必要的 try-catch block ,否则它们也必须抛出异常。我缺少一种优雅的解决方法吗?我知道我可以轻松地复制和粘贴一些代码,但这违背了 OOP 中神圣的原则。有什么想法吗?

最佳答案

使用运行时异常。具体来说,IllegalArgumentException 就是为此而设计的。

关于java - 如何在构造函数中避免这种不必要的 throws 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672222/

相关文章:

c# - 在抛出并捕获异常后恢复执行代码

java - 运行 find 会抛出一个 Detached 实体传递给持久异常

java - 如何使用带有 TextView 列表的单选按钮

java - 组合具有不同端点的 for 循环

java - 从 Android 服务关闭屏幕

ruby-on-rails - Rails 3 中的动态错误页面

java - 按每个汉堡的成本降序排序,这是一个带有 Collections.sort 的 ArrayList

c++ - 是否可以将成员初始化推迟到构造函数主体?

inheritance - Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?

Java - 来自构造函数的 setter