Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免构造函数中出现这种不必要的throws语句?_Java_Exception_Constructor_Try Catch - Fatal编程技术网

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

Java 如何避免构造函数中出现这种不必要的throws语句?,java,exception,constructor,try-catch,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 Exce

因此,我有一个名为
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
    }
}
public Puzzle() {
    try {
        this(3);
    } catch (Exception e) {
        // Never happens
    }
}

这里的问题是对
this(3)
的调用不再是构造函数的第一条语句,因此它不会编译。似乎我必须用
throws
子句标记这个构造函数,尽管我知道它永远不会抛出异常。这真的很烦人,因为调用代码需要有不必要的try-catch块,否则它们也必须抛出异常。有没有一种优雅的方式让我错过了?我知道我可以很容易地复制和粘贴一些代码,但这与OOP中神圣的东西格格不入。有什么想法吗?

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

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
    }
}
公共类难题{
//字段、方法等。
公共拼图(){
构造(3);
}
公共拼图(int n)引发异常{
如果(n<2)抛出新异常();
构造(n);
}
私有void构造(int n){
//更多构造函数代码
}
}

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

这是一个可行的想法,尽管私有初始值设定项是一个痛苦的原因,您不能使用最终成员。@jtahlborn true。你的回答是一个更好的方法。不过+1是一个可行的解决方案。我真不敢相信我竟然没有想出这样的主意。这是最简单的解决方案,只需要最少的修改。谢谢因为这是不应该发生的事情,所以请使用AssertionError。当存在非法参数时,请使用IllegalArgumentException。@PeterLawrey-不理解此处的参数。我将AssertionError与不应该发生的违反内部不变量(即代码中存在逻辑错误)联系起来。@jtahlborn这就是我所理解的
//从不发生
的意思。i、 e.只有发生严重的内部错误时,才会发生这种情况。这是
断言为false的错误抛出。@PeterLawrey-哦,你说的是如何重新抛出异常。我的答案是解决最初的异常抛出(至少,这是我的意图)。