100

次のコードで Eclipse から「リソース リーク: 'in' は決して閉じられません」というメッセージが表示されるのはなぜですか?

public void readShapeData() {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();
4

14 に答える 14

85

スキャナーを閉じていないため

in.close();
于 2012-09-20T19:14:13.163 に答える
67

他の人が言ったように、IO クラスで「close」を呼び出す必要があります。これは、次のように、キャッチなしで try - finally ブロックを使用するのに最適な場所であることを付け加えておきます。

public void readShapeData() throws IOException {
    Scanner in = new Scanner(System.in);
    try {
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();
    } finally {
        in.close();
    }
}

これにより、スキャナーが常に閉じられ、適切なリソースのクリーンアップが保証されます。

同様に、Java 7 以降では、「try-with-resources」構文を使用できます。

try (Scanner in = new Scanner(System.in)) {
    ... 
}
于 2012-09-20T20:06:56.650 に答える
8
// An InputStream which is typically connected to keyboard input of console programs

Scanner in= new Scanner(System.in);

上記の行は、引数 System.in で Scanner クラスのコンストラクターを呼び出し、新しく構築されたオブジェクトへの参照を返します。

キーボードに接続されている入力ストリームに接続されているため、実行時にユーザー入力を取得して必要な操作を実行できます。

//Write piece of code 

メモリリークを取り除くには -

in.close();//write at end of code.
于 2017-02-03T12:05:15.757 に答える
7

System.inでインスタンス化した Scanner を閉じる必要があることを示していますScanner.close()。通常、すべてのリーダーは閉じている必要があります。

System.inを閉じると、再び読み取ることができなくなることに注意してください。Consoleクラスの見学もできます。

public void readShapeData() {
    Console console = System.console();
    double width = Double.parseDouble(console.readLine("Enter the width of the Rectangle: "));
    double height = Double.parseDouble(console.readLine("Enter the height of the Rectangle: "));
    ...
}
于 2012-09-20T19:30:43.313 に答える
6

JDK7 または 8 を使用している場合は、リソースで try-catch を使用できます。これにより、スキャナーが自動的に閉じられます。

try ( Scanner scanner = new Scanner(System.in); )
  {
    System.out.println("Enter the width of the Rectangle: ");
    width = scanner.nextDouble();
    System.out.println("Enter the height of the Rectangle: ");
    height = scanner.nextDouble();
  }
catch(Exception ex)
{
    //exception handling...do something (e.g., print the error message)
    ex.printStackTrace();
}
于 2015-06-17T07:16:35.483 に答える
5

追加private static Scanner in;しても問題は実際には解決されず、警告が消えるだけです。スキャナーを静的にするということは、スキャナーが永久に (または、クラスがアンロードされるまで、ほぼ「永久に」) 開いたままになることを意味します。コンパイラは、「永久に開いたままにしておいてください」と言ったため、警告を表示しなくなりました。しかし、リソースが不要になったらすぐにクローズする必要があるため、これは本当に望んでいたことではありません。

HTH、マンフレッド。

于 2014-10-01T09:56:59.280 に答える
4

作業が完了したら、スキャナーを閉じる必要があります。

in.close();
于 2012-09-20T19:15:07.130 に答える
2

一般に、I/O を処理するクラスのインスタンスは、処理が終了したら閉じる必要があります。したがって、コードの最後にin.close().

于 2012-09-20T19:15:11.243 に答える
1

スキャナを閉じる必要があります。リーダー、ストリーム、およびこの種のオブジェクトを閉じて、リソースを解放し、メモリ リークを回避することをお勧めします。そして、それらのオブジェクトの処理中に例外が発生した場合でも、finally ブロックでこれを行うことで、それらが確実に閉じられるようにします。

于 2012-09-20T19:59:58.590 に答える
1
private static Scanner in;

プライベート静的 Scanner クラス変数として宣言することで修正しました。なぜそれが修正されたのかはわかりませんが、それがEclipseが推奨することです。

于 2013-06-04T19:29:13.207 に答える
-1
in.close();
scannerObject.close(); 

Scanner警告を閉じて閉じます。

于 2016-09-16T06:24:46.533 に答える