3

Java ドキュメントで私はこれを読んでいます: try ブロックが終了すると、finally ブロックは常に実行されます。これにより、予期しない例外が発生した場合でも、finally ブロックが実行されます。しかし、finally は例外処理以外にも役立ちます。これにより、プログラマーはクリーンアップ コードが return、continue、または break によって誤ってバイパスされるのを防ぐことができます。

break または continue で try ブロックを終了するのはいつですか? 私が考えることができる唯一のシナリオは、try ブロック内でループを実行していて、break/continue を使用して終了することですが、try ブロック自体ではなく、ループの外で終了する必要があります。

4

5 に答える 5

6

ブレークまたはコンティニューで try ブロックを終了するのはいつですか?

ループtry 内にある場合。例えば

 for (Cat cat : cattery) {
     try {
          cat.removeFromCage();
          cat.healthCheck();
          if (cat.isPedigree()) {
              continue;
          }
          cat.spey();
     } finally {
          cat.putBackInCage();
     }
 }

わかりました...その「コード」を書くもっとエレガントな方法があります...しかし、それは単なる例です。

私が考えることができる唯一のシナリオは、try ブロック内でループを実行していて、break/continue を使用して終了することですが、try ブロック自体ではなく、ループの外で終了する必要があります。

そうです。


FWIW、try ブロックからの抜け出し、catch からの復帰、finally、またはその他の「エッジ ケース」のいずれかを含むコードは、おそらく単純化する必要があります。JLSは、これらのシナリオで何が起こるかを明確に指定しています...しかし、それは実際のプログラムでそれらを使用する必要があるという意味ではありません.

于 2013-04-13T03:01:11.750 に答える
2

完全に不自然な例:

import java.io.*;

public class Foo {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 10; i++) {
            File file = new File("file-" + i);
            FileWriter out = null;
            try {
                out = new FileWriter(file);
                if (file.exists()) return;
                out.write("Number " + i);
                if (i % 2 == 0) continue;
                else if (i % 3 == 0) break;
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                out.close();
            }
        }
    }
}

try の中で return、break、または continue (または例外をスロー) したいことはまったく自然なことです。この例では、finally の実行が保証されていない場合、リソース リークが発生します。

はい、この特定の問題はJDK7 の try-with-resourceによって解決されます。

于 2013-04-13T03:01:12.320 に答える
1

はい、break/continueはループにのみ影響し、try/ catch/finallyブロックには影響しません。ドキュメントは、例外を処理しようとすると、特にフローを変更する卑劣なbreaks とs を使用して、クリーンアップ コードのブロックを誤って見逃しやすい (実行しない) ことを指摘しているだけです!continue

finally ブロックは、呼び出されるか JVM がクラッシュしない限り、常に実行する必要がありSystem.exit()ます。

于 2013-04-13T03:01:18.217 に答える