-1

finally を使用して「リターン後」にコードを持つ可能性を発見しました。ここにいくつかの例を示します。

int foo() {
    BufferedReader br = ...;
    try {
        // cca 20 lines with 4 returns in different if-else clauses etc
        //example:
        if(something) {
            return 0;
        } else {
            return 1;
        }
    } finally {
        br.close();
    }
}

(私の意見では、はるかに怠惰な)代替手段として:

int foo() {
    BufferedReader br = ...;
    int toReturn;

    // cca 20 lines with 4 ASSIGMENTS in different if-else clauses etc
    //example:
    if(something) {
        toReturn = 0;
    } else {
        toReturn = 1;
    }

    br.close();
    return toReturn;
}

それで、問題は、どちらがより速く、より読みやすいかということです。はい、この場合、私は本当に BufferedReader を閉じています。

4

4 に答える 4

3

を使用しないtry/catch/finallyと、例外がスローBufferedReaderされた場合、適切に閉じられず、メモリ リークが発生したり、望ましくないファイルがロックされる可能性があります...

を使用finallyすると、ブロックBufferedReaderの処理中に例外がスローされた場合でも、閉じられます。try

ただし、インスタンス化も例外をスローする可能性があるため、ブロックBufferedReaderに含める必要があります。try

BufferedReader br = null;
try {
    br = ...;
    // do your stuff
}
catch (Exception e) {
    // handle exception
}
finally {
    if(br != null)
        br.close();
}

Java 7 以降を使用している場合は、Arnaud が述べているように、エレガントなTry-with-resources を使用してください。

于 2013-09-11T12:27:53.453 に答える
1

がある場合exception throws、最初のケースはキャッチしていないため、コードは失敗し、exception2 番目のケースでは処理の証拠がありませんexception

finallyここで任意の方法で実行されます。

ファイルを読み取って入力を取得する場合、BufferedReader両方の方法でファイルが見つからない場合は役に立ちません。

于 2013-09-11T12:27:14.167 に答える
1

私はそれを間違った方法で使用していますか?

はい、そうです。somethingメソッド呼び出しで例外がスローされた場合、br は閉じられません。最後に、いずれにしても実行されることを確認します*

`* - finally 句の実行を回避できる条件がいくつかあります

于 2013-09-11T12:27:28.920 に答える
1

2番目のものは実際には受け入れられません。例外が発生した場合、バッファを閉じません。

try-with-resourcesステートメントを使用することをお勧めします(その目的のためのものです)。

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    //do what you want with the buffer. It will automatically be closed.
    return;
}

try-with-resources ステートメントを参照してください

于 2013-09-11T12:28:34.657 に答える