Scannerからの入力が尻切れトンボになる原因

Scannerは内部のReaderクラスでIOExceptionが起こるとそれを終了条件とみなしてしまい、上位処理には直接Exceptionを報告しない。つまり、try-catchでは掴まらない。Scanner終了後に別途Exceptionが発生したのかどうか確かめないと、正常終了と何かトラブルがあって読み込めなかったのとの区別が付かない。

具体的には、Scanner#hasNextなんちゃら()がfalseを返した後、Scanner#ioException()で調べる。


Scanner fileScanner;
String lineBuffer;
try {
fileScanner = new Scanner(new File(inFileName));
while (fileScanner.hasNextLine()) {
lineBuffer = fileScanner.nextLine();
// 何らかの処理
}

if (fileScanner.ioException() != null) {
System.out.println("ファイル読み込み時に次のエラーが発生しました");
System.out.println(fileScanner.ioException());
System.exit(0);
}
} catch (FileNotFoundException e) {
System.err.println(e);
} catch (IOException e) {
// このIOException処理には来ない
e.printStackTrace();
} finally {
if (fileScanner != null) {
fileScanner.close();
}
}