1

Java では、while ループ内で例外がスローされる可能性がある場合に try-catch ブロックで囲まれたループと、ループ内で try-catch ブロックで囲まれたステートメントとの間に違いがあります。

たとえば、次のコード スニペットは異なります。


スニペット 1:

try {
    for (File file : files) {
        FileInputStream fis = new FileInputStream(file);
        System.out.println("OK!");
    }
}
catch (FileNotFoundException exc) {
    System.out.println("Error!");
}

^このコード スニペットは、a FileNotFoundException がスローされた場合にループを中断します。そのため、ファイルを読み取ることができない場合、ループが中断され、Java はそれ以上のファイルの読み取りを停止します。


スニペット 2:

for (File file : files) {
    try {
        FileInputStream fis = new FileInputStream(file);
        System.out.println("OK!");
    }
    catch (FileNotFoundException exc) {
        System.out.println("Error!");
    }
}

^このコード スニペットは、例外がスローされた場合にループを中断しません。例外が発生した場合、コードは例外をキャッチして の次の要素に進み filesます。つまり、ファイルの読み取りを停止しません。


ここで、ディレクトリ内の特定のファイル (たとえば、 bananas.xml )を読み取りたいと考えています。そのファイルが読み取り可能かどうかに関係なく、XML ファイルはメタデータ ファイルであり、プログラムの実行には必要ない可能性があります。対応するディレクトリ (バナナ):

File main = new File("/home/MCEmperor/test");
File fruitMeta = new File(main, "bananas.xml");
FileInputStream fruitInputStream = new FileInputStream(fruitMeta); // This code COULD throw a FileNotFoundException
// Do something with the fruitInputStream...

File fruitDir = new File(main, "bananas");
if (fruitDir.exists() && fruitDir.canRead()) {
    File[] listBananas = fruitDir.listFiles();
    for (File file : listBananas) {
        FileInputStream fis = new FileInputStream(file); // This code COULD throws a FileNotFoundException
        // Do something with the fis...
    }
}

上記のスニペットの 2 行で a がスローされる可能性がありFileNotFoundException、ループを中断したくありません。

例外がスローされた場合に両方の行をキャッチする 1 つの try-catch ブロックを作成する方法はありますが、ループを壊すことはありforませんか?

4

1 に答える 1