Сканер никогда не закрывается

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

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

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  2)); System.out.println("You've selected " + amountOfPlayers+" player(s)."); } } 

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

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

Или еще лучше: используйте новую команду Try with resource :

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

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

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

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

 try(Scanner sc = new Scanner(System.in)) { //Use sc as you need } catch (Exception e) { // handle exception } 

Попробуй это

 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)."); 
  • NoSuchElementException с Java.Util.Scanner
  • Сканер против StringTokenizer против String.Split
  • Сканер только считывает имя файла и ничего больше
  • Ввод Java String Scanner не дожидается информации, перемещается непосредственно в следующий оператор. Как дождаться информации?
  • Странное поведение со сканером # nextFloat
  • Как использовать java.util.Scanner, чтобы правильно читать данные пользователя из System.in и действовать на него?
  • Исключение в streamе "main" java.util.NoSuchElementException
  • Извлечь целочисленную часть в строке
  • Как использовать несколько объектов Scanner в System.in?
  • Чтение CSV со сканером ()
  • Возьмите входной сигнал Char от сканера
  • Interesting Posts
    Давайте будем гением компьютера.