2013-03-25 6 views
19

Я работаю над игрой, и у меня возникла небольшая проблема с моим сканером. Я получаю сканер утечки ресурсов, который никогда не закрывался.Сканер никогда не закрывается

Но я думал, что мой сканер работает до этого, не закрывая его. Но теперь это не так. Кто-нибудь может помочь мне здесь?

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

Как вы можете сказать, что сканер не работает больше? Какое поведение вы видите? –

ответ

36

Я предполагаю, что вы используете Java 7, таким образом, вы получите предупреждение компилятора, если не закрывать ресурс, который вы должны закрыть сканер обычно в конце концов блока.

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

Или еще лучше: использовать новый Try with resource statement:

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

Должен ли 'новый сканер (System.in)' быть окружен блоком 'try-catch'? – Maroun

+0

@MarounMaroun не обязательно. но это хорошая практика, чтобы закрыть ваши ресурсы внутри блока finally. – PermGenError

+1

Спасибо, реально, как Try with resource statement, работает как шарм! –

0

Попробуйте

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

Согласно Javadoc Сканера, она закрывает поток, когда вы называете это близко метод. Вообще говоря, код, создающий ресурс, также отвечает за его закрытие. System.in не был создан вашим кодом, а VM. Поэтому в этом случае безопасно не закрывать сканер, игнорировать предупреждение и добавлять комментарий, почему вы его игнорируете. VM при необходимости позаботится о его закрытии.

(Offtopic: вместо «amount» слово «number» было бы более подходящим для использования для нескольких игроков. Английский не является моим родным языком (я голландский), и я делал то же самое ошибка.)

1

Вот некоторые лучше использование Java для сканера

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

    //Use sc as you need 

} catch (Exception e) { 

     // handle exception 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^