Подтвердить что ты не робот

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

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

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

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)."); 
    }
}
4b9b3361

Ответ 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).");