Сканер никогда не закрывается
Я работаю над игрой, и у меня возникла небольшая проблема с моим сканером. Я получаю сканер утечки ресурсов, который никогда не закрывался.
Но я думал, что мой сканер работает до этого, не закрывая его. Но теперь это не так. Кто-нибудь может помочь мне здесь?
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)."); } }
- Невозможно использовать Scanner.nextInt () и Scanner.nextLine () вместе
- Метод сканирования для получения символа
- Читать следующее слово в java
- Получение пользовательского ввода со сканером
- nextDouble () выдает исключение, когда я ввожу двойную
- Закрыть сканер, связанный с System.in
- Как я могу справиться со сканером (java)?
- Сканер не видит после пробела
- Использование scanner.nextLine ()
- Сканер против BufferedReader
- Java: бесконечный цикл с использованием Scanner in.hasNextInt ()
- Почему hasNextLine () никогда не заканчивается?
- Как обрабатывать бесконечный цикл, вызванный недопустимым вводом (InputMismatchException) с помощью Scanner
Я предполагаю, что вы используете 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).");