そのため、 というクラスとPuzzle
、それに対応する 2 つの (関連する) コンストラクターがあります。1 つのコンストラクターは引数を受け入れず、もう 1 つのコンストラクターは 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 を取るコンストラクターは例外をスローし、引数のないコンストラクターは例外を処理またはスローしないからです。しかし、例外がスローされないことは明白なので (コンストラクターの本体でスローされる例外はもうありません)、これは問題ではありません。次のように空の try-catch ステートメントを使用できます。
public Puzzle() {
try {
this(3);
} catch (Exception e) {
// Never happens
}
}
ここでの問題は、への呼び出しがthis(3)
コンストラクターの最初のステートメントではないため、コンパイルされないことです。例外がスローされないことはわかっていますが、このコンストラクターをthrows
句でマークする必要があるようです。これは、コードの呼び出しに不必要な try-catch ブロックが必要になるか、例外もスローする必要があるため、非常に厄介です。私が見逃しているエレガントな方法はありますか?一部のコードを簡単にコピーして貼り付けることができることはわかっていますが、それは OOP で神聖なすべての要素に反します。何か案は?