Scanner
がSystem.in
にリンクされています。 Scanner
を使用した後、開いたままにしておくのは悪いコーディング慣行であるため、閉じる必要があります。ただし、Scanner
を閉じると、System.in
も閉じます。 System.in
を閉じずにScanner
を閉じる方法を教えてもらえますか(方法がある場合)。
1つのオプションは、System.in
ストリームをCloseShieldInputStream
でラップして、閉じられないようにすることです。読者は、生のSystem.in
ストリームではなくCloseShieldInputStream
を使用します。
このクラスのAPIは次のとおりです。 http://commons.Apache.org/io/apidocs/org/Apache/commons/io/input/CloseShieldInputStream.html
最も簡単なことは、基になるストリームを閉じたくない場合はスキャナーを閉じないことです。
理想的には、プログラムの存続期間中に使用するスキャナーを1つだけ作成する必要があります。いずれにせよ、あなたはそれを閉じる正当な理由がないようです。
シールドクラスやそのようなものを追加する代わりに、素敵なコメントと
@SuppressWarnings("resource")
それで十分です。そして、私はこのアプローチに多くの欠点を見ているようには見えません。コメントを忘れないでください。
同じScanner
のSystem.in
を2度使用すると、奇妙で診断不可能な問題の漠然とした記憶があります。プログラム):
static String input() {
try {
return new Scanner(System.in).nextLine();
} catch (NoSuchElementException e) {
throw e;
}
}
何らかの理由でこれは警告なしで機能しますが、キャッチスローを行わないと、EclipseはResource leak: '<unassigned Closeable value>' is never closed
と文句を言います。