1

私はこれを読みました:コンストラクターでスローを使用できますか? -- それは私に正しい考えを与え、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

4

4 に答える 4

1

コンストラクターからファイル構築コードをリファクタリングして、次のようなことを行うことができます-

public ExampleClass() {
  try {
      fileInputStreamMethod(DEFAULT_FILE);
  }
  catch(Exception e) {
    ...
  }

public ExampleClass(String fileName) throws Exception {
    fileInputStreamMethod(fileName);
}

private void fileInputStreamMethod(String fileName) throws Exception {
    // your file handling methods
}
于 2011-08-19T18:36:46.913 に答える
0

this(...)の呼び出しから例外をキャッチできないのは正しいです。

静的メソッドを使用して、必要なものを生成できます。

static ExampleClass createDefault()
{
  try
  {
    return new ExampleClass(DEFAULT_FILE_NAME);
  }
  catch(Exception e)
  {
    DoSomethingToHandleException(e)
  } 
}
于 2011-08-19T18:36:28.583 に答える
0

あなたはこのようなことをすることができます:

public ExampleClass(String FileName)
{
   this(getStream(FileName));
}

private static FileInputStream getStream(String name) {
    try {
        return new FileInputStream(name);
    } catch (Exception e) {
        // log error
        return null;
    }
}

本当の問題は、なぜ例外をスローしたくないのかということです。ファイルを開くことができない場合、プログラムはどのように動作する必要がありますか?問題なく進めてほしいというのは珍しいと思います。おそらく、null入力ストリームは後で悲しみを引き起こすでしょう。

一般に、エラーの発生源のできるだけ近くで例外をスローすることをお勧めします。

于 2011-08-19T18:37:03.867 に答える
0

基本的に、コンストラクターが別のメソッド (コンストラクターではないもの) で実行する必要がある作業を実行し、それをデフォルトのコンストラクターで使用する必要があります。しかし、この手法がシナリオでどれほど役立つかはわかりません。

乾杯!

于 2011-08-19T18:49:10.793 に答える