2016-06-02 10 views
1

Um die skipping nextLine() issue zu bekommen, und den Code sauberer zu machen, hat ich ein paar Mal den folgenden Ansatz verwendet:Garbage Collection von unclosed Scanner

private String getInput() { 
    return new Scanner(System.in).nextLine(); 
} 

Dieser jeder Produktionscode nicht gewesen sein, nur kleine Projekte Ich habe mich also nicht viel darum gekümmert, ob dies zu Leistungsproblemen führen könnte, da ich den Ansatz sehr praktisch fand. Ich verwende diese Methode sehr gerne für alle Eingaben und parse den Rückgabewert.

Auf die Frage - ist das eine sehr schlechte Praxis? Ich fühle mich nicht gut, den Scanner nicht zu schließen, aber da das Objekt außer Reichweite ist, habe ich gedacht, dass das Scanner-Objekt Müll gesammelt und daher auch geschlossen werden sollte. Wie geht das mit dem GC um?

Antwort

1

Sie müssen nicht close es in diesem Fall sonst wird System.in auch so geschlossen werden, dass Sie nicht in der Lage sein werden, jede neue Eingabe zu erhalten, in der Tat, wenn Sie diesen einfachen Code ausführen:

Scanner scanner = new Scanner(System.in); 
scanner.close(); 
scanner = new Scanner(System.in); 
scanner.nextLine(); // -> Exception here 

Sie erhalten die nächste Ausnahme:

Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Scanner.java:1540) 
    at hello.Application.main(Application.java:44) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 

das einzige wirkliche Problem, dass ich mit Ihrem Ansatz sehen, ist die Tatsache, dass es ineffizient sein kann, wenn Sie diese Methode regelmäßig aufrufen, wie Sie eine neue Instanz Scanner bei jedem Aufruf, moreov erstellen Es könnte JDK-Implementierung spezifisch sein, denn wenn Sie eine Implementierung von Scanner haben, die die Methode finalize implementiert, kann es die Scanner schließen, die zu dem oben beschriebenen Fehler führen würde.

+0

Könnten Sie den Fehler oben genauer erklären, ich bekomme das Problem nicht? Und natürlich verstehe ich es ineffizient, aber der Leistungsbeeinflussung muss _minimal_ sein. –

+1

Überprüfen Sie das Schließen der Methode eines Scanners, wenn Sie einen Scanner schließen, schließt es auch die Quelle, die System.in hier ist, so dass Sie den Eingabestrom nicht mehr lesen können –

+0

Wenn Sie es ein paar Mal tun, sollte die Wirkung sein minimal, es hängt von Ihrem Anwendungsfall ab –

0

Die Scanner verfügt über eine finalize() Methode, die alle nativen Ressourcen schließt, wenn das Objekt GC'd ist.

+0

Aber ist dieser Ansatz schlechte Praxis? Wenn ja warum? –

+0

Ich denke, es ist eine schlechte Übung, stellen Sie sich vor, für jeden einzelnen Eingang ein neues Objekt zu erstellen, anstatt nur eines zu erstellen !! Ich schlage vor, Sie bearbeiten Ihre Antwort – niceman

+1

Ich sehe keine Finalize-Methode in Scanner welche JDK verwenden Sie? –