2

所以,我有一个名为 的类Puzzle,以及它的两个(相关)构造函数。一个构造函数不接受 args,另一个接受 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 块,否则它们也必须抛出异常。有没有一种我想念的优雅方法?我知道我可以轻松地复制和粘贴一些代码,但这与 OOP 中所有神圣的东西背道而驰。有任何想法吗?

4

2 回答 2

6

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

于 2012-12-02T18:20:26.240 回答
1

将构造函数中的代码分解为私有初始化方法:

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

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

        construct(n);        

    }

    private void construct(int n) {
        // More constructor code
    }
}
于 2012-12-02T18:18:58.503 回答