2013-03-25 24 views
19

Pracuję nad grą i natknąłem się na mały problem z moim skanerem. Otrzymuję skaner wycieków zasobów nigdy nie jest zamknięty.Skaner nigdy nie jest zamknięty

Ale myślałem, że mój skaner pracował wcześniej bez zamykania go. Ale teraz nie jest. Czy ktoś może mi tutaj pomóc?

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

Jak można powiedzieć, że skaner nie działa już? Jakie zachowanie widzisz? –

Odpowiedz

36

jestem zakładając używasz Java 7, dzięki czemu można dostać ostrzeżenie kompilatora, jeśli nie zamknąć zasób należy zamknąć skaner zwykle w bloku finally.

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

Albo jeszcze lepiej: użyj nowego Try with resource statement:

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

Czy 'nowy skaner (System.in) powinien być otoczony blokiem' try-catch'? – Maroun

+0

@MarounMaroun niekoniecznie. ale jest to dobra praktyka, aby zamknąć swoje zasoby wewnątrz bloku finally. – PermGenError

+1

Dzięki, naprawdę jak Wypróbuj z informacją o zasobach, działa jak urok! –

0

Spróbuj

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

Według Javadoc Scanner, zamyka strumień podczas rozmowy jest blisko metoda. Ogólnie rzecz biorąc, kod, który tworzy zasób, jest również odpowiedzialny za jego zamknięcie. System.in nie został utworzony przez twój kod, ale przez VM. W takim przypadku bezpiecznie nie można zamknąć skanera, zignorować ostrzeżenia i dodać komentarz, dlaczego go ignorujesz. Maszyna VM zadba o jej zamknięcie w razie potrzeby.

(Offtopic: zamiast "kwoty", słowo "liczba" byłoby bardziej odpowiednie dla wielu graczy, angielski nie jest moim ojczystym językiem (jestem holenderski) i zawsze robiłem dokładnie to samo pomyłka.)

1

Oto lepsze wykorzystanie java na skanerze

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

    //Use sc as you need 

} catch (Exception e) { 

     // handle exception 

}