私はこれを読みました:コンストラクターでスローを使用できますか? -- それは私に正しい考えを与え、1 つの答えに導きましたが、あまり明確ではありませんでした。他にもいくつか読んだことがありますが、答えが見つかりませんでした。コンテキストについて学んだことを要約すると、基本的に、これはコンパイルされません...
public ExampleClass(String FileName)
{
this(new FileInputStream(FileName));
}
public ExampleClass(FileInputStream FileStream)
{
DoSomethingToSetupBasedUponFileStream(FileStream);
}
...FileInputStream
コンストラクター (文字列コンストラクターから呼び出される) が FileNotFoundException をスローする可能性があるためです。次のように同じ例外をスローすることで、コンストラクターを作成できます。
public ExampleClass(String FileName) throws FileNotFoundException
{
this(new FileInputStream(FileName));
}
私の質問は、デフォルトのファイル名文字列定数を単に使用するデフォルトのコンストラクター (引数なし) に関連しています。
public ExampleClass() throws FileNotFoundException
{
this(DEFAULT_FILE_NAME);
}
これにより、コンストラクターが次のようにチェーンされます。
ExampleClass()
--> ExampleClass(<String>)
-->ExampleClass(<InputFileStream>)
このような場合、デフォルト コンストラクターでデフォルト値 (静的最終クラス メンバー) を使用して FileInputStream をインスタンス化 (チェーンのさらに下) することは可能ですが、throws FileNotFoundException
コードを使用する必要はありません (誰かがクラスを再スローするか例外を処理するか?
次のようなことができれば、自分で例外を処理します。
public ExampleClass()
{
try
{
this(DEFAULT_FILE_NAME);
}
catch (Exception e)
{
DoSomethingToHandleException(e);
}
}
...しかし、「コンストラクター呼び出しはコンストラクターの最初のステートメントでなければならない」ため、これは不可能です。
この時点で.Netに慣れてきたので、本当にしたくない場合は、例外を処理することを余儀なくされたことはありません... :D