Сканер никогда не закрывается
Я работаю над игрой, и я столкнулся с небольшой проблемой с моим сканером.
Я получаю сканер утечки ресурсов, который никогда не закрывался.
Но я думал, что мой сканер работает до этого, не закрывая его.
Но теперь это не так. Кто-нибудь может помочь мне здесь?
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 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).");
}
}
Ответы
Ответ 1
Я предполагаю, что вы используете java 7, поэтому вы получаете предупреждение о компиляторе, когда вы не закрываете ресурс, который должен закрыть ваш сканер, как правило, в блоке finally.
Scanner scanner = null;
try {
scanner = new Scanner(System.in);
//rest of the code
}
finally {
if(scanner!=null)
scanner.close();
}
Или еще лучше: используйте новый Попробовать с помощью оператора ресурса:
try(Scanner scanner = new Scanner(System.in)){
//rest of your code
}
Ответ 2
Согласно Javadoc Scanner, он закрывает поток, когда вы вызываете его методом close. Вообще говоря, код, создающий ресурс, также отвечает за его закрытие. System.in не был создан вашим кодом, а VM. Поэтому в этом случае безопасно не закрывать сканер, игнорировать предупреждение и добавлять комментарий, почему вы его игнорируете. VM при необходимости позаботится о его закрытии.
(Offtopic: вместо "amount" слово "number" было бы более подходящим для использования для нескольких игроков. Английский не мой родной язык (я голландский), и я делал точно такую же ошибку.)
Ответ 3
Вот несколько улучшений использования java для сканера
try(Scanner sc = new Scanner(System.in)) {
//Use sc as you need
} catch (Exception e) {
// handle exception
}
Ответ 4
Попробуйте это
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 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).");