2013-03-25 11 views
19

Ich arbeite an einem Spiel und ich stieß auf ein kleines Problem mit meinem Scanner. Ich bekomme einen Ressourcenleck-Scanner nie geschlossen.Scanner ist nie geschlossen

Aber ich dachte, dass mein Scanner vorher arbeitete, ohne es zu schließen. Aber jetzt ist es nicht. Kann mir hier jemand helfen?

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)."); 
    } 
} 
+2

Wie kann man sagen, dass der Scanner nicht mehr funktioniert? Welches Verhalten siehst du? –

Antwort

36

ich Sie Java verwenden ich davon aus 7, so erhalten Sie einen Compiler-Warnung, wenn Sie die Ressource nicht schließen sollten Sie Ihren Scanner in der Regel in einen 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: Mit den neuen Try with resource statement:

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

Sollte 'neuer Scanner (System.in)' mit 'try-catch' Block umgeben sein? – Maroun

+0

@MarounMaroun nicht unbedingt. aber es ist eine gute Übung, deine resources in einem finally Block zu schließen. – PermGenError

+1

Danke, wirklich wie der Versuch mit Resource Statement, funktioniert wie ein Charme! –

0

Versuchen Sie, diese

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)."); 
4

Nach dem Javadoc von Scanner, schließt er den Strom, wenn Sie es in der Nähe Methode aufrufen. Im Allgemeinen ist der Code, der eine Ressource erstellt, auch für das Schließen verantwortlich. System.in wurde nicht von Ihrem Code, sondern von der VM instanziiert. 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 wird dafür sorgen, dass sie bei Bedarf geschlossen wird.

(Offtopic: statt "Menge", wäre das Wort "Nummer" besser geeignet für eine Reihe von Spielern. Englisch ist nicht meine Muttersprache (ich bin Holländer) und ich habe genau das gleiche gemacht Fehler.)

1

hier etwas bessere Nutzung von Java für Scanner

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

    //Use sc as you need 

} catch (Exception e) { 

     // handle exception 

} 
Verwandte Themen