2013-03-25 15 views
19

Sto lavorando a un gioco e mi sono imbattuto in un piccolo problema con il mio scanner. Sto ottenendo uno scanner di perdita di risorse mai chiuso.Lo scanner non viene mai chiuso

Ma ho pensato che il mio scanner funzionasse prima senza chiuderlo. Ma ora non lo è. Qualcuno può aiutarmi qui?

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

Come si può dire che lo scanner non funziona più? Che comportamento vedi? –

risposta

36

Io parto dal presupposto che si sta utilizzando Java 7, in tal modo si ottiene un avviso del compilatore, quando non si chiude la risorsa è necessario chiudere lo scanner di solito in un blocco finally.

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

O ancora meglio: utilizzare la nuova Try with resource statement:

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

Il 'nuovo scanner (System.in)' deve essere circondato con il blocco 'try-catch'? – Maroun

+0

@MarounMaroun non necessariamente. ma è una buona pratica per chiudere le risorse in un blocco finale. – PermGenError

+1

Grazie, proprio come l'istruzione Prova con risorsa, funziona come un incantesimo! –

0

Prova questa

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

Secondo il Javadoc di Scanner, si chiude il flusso quando si chiama è vicino metodo. In generale, il codice che crea una risorsa è anche responsabile della sua chiusura. System.in non è stato istanziato dal tuo codice, ma dalla VM. Quindi in questo caso è sicuro non chiudere lo Scanner, ignorare l'avviso e aggiungere un commento perché lo ignori. La VM si prenderà cura di chiuderla se necessario.

(Offtopic: anziché "importo", la parola "numero" sarebbe più appropriata da utilizzare per un numero di giocatori. L'inglese non è la mia lingua madre (sono olandese) e ho usato esattamente lo stesso errore.)

1

Ecco alcuni meglio l'utilizzo di Java per scanner

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

    //Use sc as you need 

} catch (Exception e) { 

     // handle exception 

}