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

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

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

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

Как загруженный ISO становится поврежденным?

Как я могу дублировать вкладку Firefox, включая историю, с помощью сочетания клавиш?

Как разделять строку с любыми символами пробелов как разделителями?

Множество первых шансов Microsoft.CSharp.RuntimeBinderException, возникающие при работе с динамикой

Почему конверсия туда и обратно с помощью строки, небезопасной для двойной?

Универсальный меньше для указателей в стандарте C ++

Https Connection Android

Ошибка: невозможно найти adb в SDK в Android Studio

Защищенные веб-службы: REST через HTTPS и SOAP + WS-Security. Что лучше?

Как печатать строки с разрывами строк в java

Упорядочить окна в одном приложении на панели задач Windows 7

TableView не фиксирует значения по событию, потерянному фокусом

Как защитить код сценария приложений в электронной таблице Google?

Историческая причина разрыва линии на разных платформах

Как конвертировать «Mon Jun 18 00:00:00 IST 2012» до 18/06/2012?

Давайте будем гением компьютера.