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
ませんか?