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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstmal, das ist kein Speicherleck.
Zweitens, wenn Sie in der Nähe einen stream-wrapper für die Standard-Ausführung ist für das schließen der stream, der es umschließt. Dies bedeutet, dass das erste mal, wenn Sie schließen Sie Ihren Virenscanner (wie es geschrieben wird), ja, Sie schließen.in.
Im Allgemeinen, man möchte vermeiden, schließen System.wenn Sie wurden Sinne zu Lesen aus dem System.in wieder. Der beste Weg zu gehen über diese hängt von Ihrem Programm.
Könnte man kopieren Sie die Informationen aus dem System.in in einem Puffer von einigen Sortieren und Scannen Sie dann den Puffer. Könnte man nicht schließen Sie die Scanner, die Wiederverwendung in anderen Orten. Man könnte auch de-Referenz, die der Scanner für die garbage-collection und erstellen Sie mehrere neue Scanner auf System.in.
Diese Lösungen sind nicht alle gleichwertig, manche sind als viel besser als andere; aber es hängt alles von dem aufrufenden Programm. Experimentieren Sie mit ein paar, und wenn Sie auf ein problem stoßen, öffnen Sie eine neue StackOverflow-Frage, wo Sie zeigen die relevanten Teile des Quellcodes, eine Beschreibung des Problems, das Beispiel Eingang, und die falsche Ausgabe (zusammen mit der gewünschten Ausgabe).
Glück.
Ja, wenn Sie in der Nähe ein scanner-Sie werden das schließen der zugrunde liegenden stream (in diesem Fall System.in). Um dies zu vermeiden, erstellen Sie entweder eine Globale variable-scanner, der verwendet werden kann, durch alle Klassen oder haben Sie einen zentralen Punkt für das Herunterfahren des Scanners (kurz bevor das Programm beendet wäre ideal)
Nicht Namen alle Scanner gleich. Wenn Sie mehrere in einer Sache wie dieser:
Setzen die
*scanner name goes here*.close();
für jeden Scanner. Wenn Sie alle den gleichen Namen haben dann ändern die das etwas anders aus und andere scanner.