所以,我有一个名为 的类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 中所有神圣的东西背道而驰。有任何想法吗?