wake-up-neo.com

Scanner wird niemals geschlossen

Ich arbeite an einem Spiel und bin auf ein kleines Problem mit meinem Scanner gestoßen. Ich bekomme einen Ressourcenleckscanner, der nie geschlossen wurde.

Aber ich dachte, mein Scanner würde funktionieren, ohne ihn zu schließen. Aber jetzt ist es nicht. Kann mir hier jemand weiterhelfen?

import Java.util.Scanner;

public class Main {

    public static final boolean CHEAT = true;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int amountOfPlayers;
        do {
            System.out.print("Select the amount of players (1/2): ");
            while (!scanner.hasNextInt()) {
                System.out.println("That's not a number!");
                scanner.next(); // this is important!
        }

        amountOfPlayers = scanner.nextInt();
        while ((amountOfPlayers <= 0) || (amountOfPlayers > 2));
        System.out.println("You've selected " + amountOfPlayers+" player(s)."); 
    }
}
26

Ich gehe davon aus, dass Sie Java 7 verwenden, daher erhalten Sie eine Compiler-Warnung, wenn Sie die Ressource nicht schließen, sollten Sie Ihren Scanner normalerweise in einem finally-Block schließen.

Scanner scanner = null;
try {
    scanner = new Scanner(System.in);
    //rest of the code
}
finally {
    if(scanner!=null)
        scanner.close();
}

Oder noch besser: Verwenden Sie das neue Try with resource statement :

try(Scanner scanner = new Scanner(System.in)){
    //rest of your code
}
48
PermGenError

Laut Javadoc of Scanner wird der Stream geschlossen, wenn Sie die Methode close aufrufen. Im Allgemeinen ist der Code, der eine Ressource erstellt, auch dafür verantwortlich, diese zu schließen. System.in wurde nicht von Ihrem Code instanziiert, sondern von der VM. In diesem Fall ist es sicher, den Scanner nicht zu schließen, die Warnung zu ignorieren und einen Kommentar hinzuzufügen, warum Sie ihn ignorieren. Die VM kümmert sich bei Bedarf um das Schließen.

(Offtopic: Anstelle von "Betrag" ist das Wort "Nummer" für eine Reihe von Spielern besser geeignet. Englisch ist nicht meine Muttersprache (ich bin Holländer) und ich habe genau den gleichen Fehler gemacht.)

5
Henno Vermeulen

Hier ist eine bessere Verwendung von Java für Scanner

try(Scanner sc = new Scanner(System.in)) {

    //Use sc as you need

} catch (Exception e) {

        //  handle exception

}
1
Dev4World

Versuche dies

Scanner scanner = new Scanner(System.in);
int amountOfPlayers;
do {
    System.out.print("Select the amount of players (1/2): ");
    while (!scanner.hasNextInt()) {
        System.out.println("That's not a number!");
        scanner.next(); // this is important!
    }

    amountOfPlayers = scanner.nextInt();
} while ((amountOfPlayers <= 0) || (amountOfPlayers > 2));
if(scanner != null) {
    scanner.close();
}
System.out.println("You've selected " + amountOfPlayers+" player(s).");
0
tmwanik