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-哦,你说的是如何重新抛出异常。我的答案是解决最初的异常抛出(至少,这是我的意图)。