0

次のステートメントを検討してください

BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));

通常、を処理するthrows Exceptionために使用する必要があるか、使用する必要があります。try-catchException

しかし、これを静的ブロックで次のように使用したい場合。できることは、try-catchブロックを使用して を処理することだけですExceptionthrowsでもここじゃ使えない?ここでjava提供されていない理由は何ですか?throws

  static {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
  }

これも追加させてください。ブロックが静的ブロックではない場合、同様のルールがここに適用されます。

 {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

通常、これは次のような方法で行うことができます

    public static void main(String[] args) throws FileNotFoundException {
    BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
     }
4

4 に答える 4

6

クラスの初期化時に実行される静的ブロックです。これはチェック例外であるため、キャッチする場所がないため、スローできません。
チェックされていない例外をスローすることは可能ですが、どちらもどこにもキャッチできないため、プログラムがクラッシュします。

代わりに、コードを

public static void init() throws FileNotFoundException
{
   BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
}

そして、プログラムの起動時に一度呼び出します。

編集:キーワードを削除してstaticも、コンパイルされた結果は何も変わりません。それが欠けていることを許すのは単なる構文です。

于 2013-09-18T12:45:35.053 に答える
0

init ブロックから例外をスローできますが、未チェックの例外である必要があります。できることはこれ

static {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        throw new IllegalStateException(e);
    }
}
于 2013-09-18T12:48:25.837 に答える
0

そのようなstaticコード ブロックは、クラスがロードされたとき (通常は JVM の起動後) に実行されるため、ここで例外をスローすると、Java プログラム全体がクラッシュします。

于 2013-09-18T12:46:04.153 に答える
0

staticブロックをエスケープする例外はExceptionInInitializerError.

言い換えれば、例外を静的初期化子から逃がさないでください - 代わりにそれらを処理してください。

于 2013-09-18T12:46:25.500 に答える