1

ファイルから読み取りを行っていますが、try/catch ブロックを使用して例外を処理したいと考えています。私は自分のコードを書きました。しかし、スキャナー オブジェクトを宣言するだけで Eclipse からエラーが発生し、null に初期化する必要がありました。以下に、2 つのバージョンのコードを記述しました。どちらがより良いプラクティスと見なされますか? また、コンストラクター/関数ヘッダーの最後に例外をスローするよりも、try/catch ブロックを使用する方が良いですか?

コード バージョン #1:

java.util.Scanner in = null;

try {
    in = new java.util.Scanner (f);
    /* use scanner */
} catch (FileNotFoundException e) {
    System.err.println("File was not found. Make sure the file exist.");
    System.err.println("Message: " + e.getMessage());
} catch (IOException e) {
    System.err.println("File could not be opened.");
    System.err.println("Message: " + e.getMessage());
} finally {
    in.close();
}

コード バージョン #2:

try {
    java.util.Scanner in = new java.util.Scanner (f);
    /* use scanner */
    in.close();
} catch (FileNotFoundException e) {
    System.err.println("File was not found. Make sure the file exist.");
    System.err.println("Message: " + e.getMessage());
} catch (IOException e) {
    System.err.println("File could not be opened.");
    System.err.println("Message: " + e.getMessage());
}
4

4 に答える 4

4

どのスニペットも正しくありません。最初のものは、close() を呼び出す前に null をチェックしないため、Scanner コンストラクターが例外をスローすると、NullPointerException が発生します。

2 つ目は、try ブロックで例外が発生した場合にスキャナーを閉じることができません。

明らかに、最初のものは 2 番目のものよりも正しいコードに近いです。

例外に関して何が最善かについては、正確さの問題です。メソッドが例外を正しく処理できる場合 (つまり、例外が処理された後もプログラムが期待どおりに動作し続けることを意味します)、例外をキャッチする必要があります。できない場合は、それを呼び出し元に伝達し、処理させる必要があります。

于 2013-04-20T12:45:43.347 に答える
1

コード バージョン #2 では、in.close();ファイルが閉じられる前に例外がスローされる場合。バージョン #1 にはその問題はありません。

リソースでtryを使用して、これら2つのバージョンを組み合わせることができます

try (java.util.Scanner in = new java.util.Scanner (new File("your file"))){
    /* use scanner */
} catch (FileNotFoundException e) {
    System.err.println("File was not found. Make sure the file exist.");
    System.err.println("Message: " + e.getMessage());
} catch (IOException e) {
    System.err.println("File could not be opened.");
    System.err.println("Message: " + e.getMessage());
}
//"in" will be closed automatically 
于 2013-04-20T12:44:53.987 に答える
1

うーん、2 番目のバージョンは無力に見えると思います。try ブロックで何らかの例外がスローされた場合、このコードは実行されません。

in.close();

なぜfinallyブロックに入れないのですか?

于 2013-04-20T12:49:56.397 に答える