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