2016-04-04 7 views
-2

Ich bin ein Neuling. Ich habe dieses Stück Code geschrieben und es zeigt, dass es dort ein Ressourcenleck gibt.Ressource Leckwarnung in Java

Scanner scan = new Scanner(System.in); 
    int i = scan.nextInt(); 

Was bedeutet das? Entschuldigung für die Naivität.

+1

Schließen Sie niemals Ihren Scanner, so dass die Ressource "durchgesickert" ist. – callyalater

Antwort

0

Dies tritt auf, weil Sie den Scanner nicht geschlossen haben. Java-Garbage Collector verwaltet nur den Speicher, also müssen Sie sie für andere Ressourcen explizit schließen. Verwenden

scan.close(); 

Hoffe, es hilft !!

0

Scanner implementiert die Closeable Schnittstelle, was bedeutet, dass es an einem bestimmten Punkt geschlossen werden sollte, deshalb erhalten Sie die Warnung. Aber ich denke, dass Sie die Antwort finden, die Sie suchen, zum Beispiel hier: Close a Scanner linked to System.in

0

Sie sind nie auf diese Ressource zu schließen, nachdem es unter Verwendung der Doc sagt, dass der Scanner der Nähe sein muss

Klassen der Umsetzung Schnittstelle java.io.Closeable (seit JDK 1.5) und java.lang.AutoCloseable (seit JDK 1.7) zu externen Ressourcen darstellen betrachtet werden, die close() mit der Methode geschlossen werden soll, wenn sie nicht länger benötigt.

Der Eclipse-Java-Compiler kann analysieren, ob Code, der solche -Typen verwendet, dieser Richtlinie entspricht.

...

Der Compiler-Flag wird [Verletzungen] mit "Ressourcenleck: 'Strom' wird nie geschlossen".

1

Was passiert ist, dass Sie nie Ihren Scanner schließen, so dass Ressource möglicherweise "leckte". Dies bedeutet, dass die JVM Objekte (Ressourcen) hinter den Kulissen zuweist, freigibt und verwaltet und wissen muss, ob das Scanner-Objekt noch verwendet wird oder ob der Speicher freigegeben werden kann ("Garbage Collection") für etwas anderes. Wenn die Ressource geschlossen ist, können Sie dem Garbage Collector mitteilen, dass diese Ressourcen bereinigt werden können. Es ist, als würde man viele Joghurtbehälter öffnen und sie um das Haus liegen lassen. Essen Sie sie noch oder können Sie sie wieder in den Kühlschrank stellen?

Dafür gibt es ein paar Lösungen. Eine davon ist, die Methode close() auf Ihrem Scanner explizit aufzurufen, wie in den anderen Antworten erwähnt. Aber es gibt einen anderen, saubereren Weg, Ressourcen zu verwalten.

In Java 7 wurde eine "try-with-resources" eingeführt, um Ressourcen wie diese automatisch zu schließen, da es für Programmierer üblich war, ihre Ressourcen zu "vergessen". Dies erleichtert es der JVM, die Ressourcen für Sie zu verwalten.

try(Scanner scan = new Scanner(System.in)) 
{ 
    int i = scan.nextInt(); 
} 
catch(Exception e) {} 
finally {} 

Ein Vorteil hat einen Versuch mit Ressourcen ist, dass es dem Programmierer für alle außergewöhnlichen Umständen Rechnung zu tragen erinnert, die auftreten können. Was würde beispielsweise passieren, wenn der Benutzer ein Zeichen anstelle eines int in der Befehlszeile eingeben würde? Was passiert, wenn etwas in Ihrer Verarbeitung eine Ausnahme auslöst und Sie vergessen haben, Ihren Scanner in diesem Ausführungszweig zu schließen?Die Try-with-Resources können dies vereinfachen und den Code prägnanter und lesbarer machen (wenn er richtig verwendet wird).

Verwandte Themen