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).
Schließen Sie niemals Ihren Scanner, so dass die Ressource "durchgesickert" ist. – callyalater