Scanner

20日のコメント欄id:rf0444にScannerを教えてもらった。
いや、存在自体は知ってたんだけど、全く使ってなかったや。
で、BufferedReaderを使ってた部分をScannerに書き直す場合に注意が必要になりそうな所が少しあった。
以下絶賛書きかけ中。


まず、次のコードをScannerで書き直すとする。

BufferedReader in = null;
try {
    in = new BufferedReader(...);
    String line;
    while ((line = in.readLine()) != null) {
        // ...
    }
} finally {
    // closeで投げられた例外も区別せずに送出
    if (in != null) in.close();
}

Scanner版はたぶんこう。

Scanner s = new Scanner(new BufferedReader(...));
while (s.hasNextLine()) {
    String line = s.nextLine();
    // ...
}
s.close();
if (s.ioException() != null) {
    throw s.ioException();
}


次はこんなコード。

BufferedReader in = null;
try {
    in = new BufferedReader(...);
    String line;
    while ((line = in.readLine()) != null) {
        // ...
    }
} finally {
    // closeで投げられた例外は無視
    if (in != null) {
        try { in.close(); } catch (IOException e) {}
    }
}

Scanner版は後始末がちょっと変更

Scanner s = new Scanner(new BufferedReader(...));
while (s.hasNextLine()) {
    String line = s.nextLine();
    // ...
}
if (s.ioException() != null) {
    IOException e = s.ioException();
    s.close();
    throw e;
}
s.close();

もしくはこう?

Scanner s = null;
try {
    s = new Scanner(new BufferedReader(...));
    while (s.hasNextLine()) {
        String line = s.nextLine();
        // ...
    }
    if (s.ioException() != null) {
        throw s.ioException();
    }
} finally {
    if (s != null) s.close();
}


また、System.inを使う場合、closeしちゃまずい。

Scanner s = new Scanner(System.in);
while (s.hasNextLine()) {
    String line = s.nextLine();
    // ...
}
if (s.ioException() != null) {
    throw s.ioException();
}

Fileオブジェクトを渡した場合は閉じても閉じなくてもどちらでもいい?