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

时间:2012-12-02 18:14:16

标签: java exception constructor try-catch

所以,我有一个名为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中所有神圣的东西相悖。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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
    }
}