Java — Closing-Scanner-und Ressourcen-Leck

Ich bin Java zu lernen und arbeiten an einigen Projekten für Spaß. Ein Problem, das ich habe ist, dass wenn ich eine Scanner Objekt Eclipse warnt mich, dass:

Resource Leak: 'scan' ist nie verschlossen.

So, ich habe eine scan.close(); am Ende von meinem code und sorgt dafür, dass die Warnung.

Das problem kommt, weil ich andere Klassen im gleichen Paket auch den scanner verwenden Objekte und Eclipse sagt mir, um zu schließen Sie die scanner in diesen Klassen jeweils. Allerdings, wenn ich tun, dass es scheint, wie es schließt ALLE von der scanner-Objekte, und ich bekomme Fehler während der Laufzeit.

Hier ist ein Beispiel, was den Fehler verursacht:

import java.util.Scanner;
public class test2 {
    public static void main(String [] args) {
        Scanner scan = new Scanner(System.in);
        int test = 0;
        do {    
            //Do stuff
            test = scan.nextInt();
            System.out.println(test);

            scanTest scanTest = new scanTest();
            scanTest.test();
        } while (test != 0);

        scan.close();       
    }
}

import java.util.Scanner;
public class scanTest { 
    public void test() {
        Scanner scanner = new Scanner(System.in);
        int blah = scanner.nextInt();
        System.out.println(blah);
        scanner.close();
    }
}

Nach scanner ist geschlossen in der scanTest Klasse und der do-Schleife in test2 eingetragen ist wieder ein Fehler tritt bei der Zeile test = scan.nextInt();

Versuchte ich das verschieben der Schaffung des scanner-Objekt in der Schleife werden nur um ein neues Objekt jedes mal so gut, aber der Fehler immer noch Auftritt.

Nicht sicher, warum dies passiert ist oder wie kann ich sicherstellen, dass alle meine I/O-Objekte werden geschlossen, ohne Probleme.

Einen post stieß ich erwähnt, dass, wenn System.in ist geschlossen, ich kann nicht wieder geöffnet werden. Wenn dies der Fall ist, würde ich nur benötigen, um sicherzustellen, dass ein scanner-Objekt mit System.in geschlossen an das Ende des Programms und @unterdrücken alle anderen scanner-Warnungen in anderen Klassen? Oder würde das immer noch verlassen alle scanner-Objekte öffnen (schlecht)?

  • Es gibt eine gute Diskussion zu diesem problem hier: stackoverflow.com/questions/12519335/...
  • Ich glaube, der trick ist, dass Sie dürfen nur ein Scanner-Objekt, welches in das System.in-Objekt. Daher müssen Sie die Struktur Ihres Codes zu nutzen, ein Scanner-Objekt.
InformationsquelleAutor SuperCow | 2014-05-13
Schreibe einen Kommentar