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

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

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

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

person Niek van der Linden    schedule 25.03.2013    source источник
comment
Как понять, что ваш сканер больше не работает? Какое поведение вы видите?   -  person Pieter Kuijpers    schedule 25.03.2013


Ответы (4)


Я предполагаю, что вы используете 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
}
person PermGenError    schedule 25.03.2013
comment
Должен ли new Scanner(System.in) быть окружен блоком try-catch? - person Maroun; 25.03.2013
comment
@MarounMaroun не обязательно. но хорошей практикой является закрытие ваших ресурсов внутри блока finally. - person PermGenError; 25.03.2013
comment
Спасибо, очень похоже на выражение «Попробуй с ресурсом», работает как шарм! - person Niek van der Linden; 25.03.2013
comment
@NiekvanderLinden кстати, просто хочу упомянуть об этом. это просто предупреждение компилятора, которое вы получаете, и я совершенно уверен, что это не вызовет никаких проблем с работой вашего сканера. компилятор просто говорит вам, что вы должны закрыть свой ресурс, который вы открыли, чтобы предотвратить утечку. :) - person PermGenError; 25.03.2013
comment
@PermGenError Спасибо за внимание, сканер работал нормально, но мне не понравилась ошибка :) - person Niek van der Linden; 25.03.2013
comment
Почему вы сами закрываете System.in? Это работа jvm при выключении. - person Eng.Fouad; 25.03.2013
comment
@PermGenError - Почему нам нужно закрыть сканер? Что подразумевается под утечкой ресурсов? - person Erran Morad; 05.05.2014
comment
@ Eng.Fouad - Тогда почему eclipse продолжает выдавать предупреждение? Это заставляет меня задуматься, не делаю ли я что-то не так. - person Erran Morad; 05.05.2014
comment
Как уже отмечал @Eng.Fouad. Я не рекомендую закрывать System.in, так как он может вам понадобиться в другом месте. Меня раздражают предупреждения о том, что нельзя закрывать ресурсы, работающие с System.in, поскольку на практике вам никогда не захочется закрывать System.in. Всегда прибегал к использованию подавления предупреждений или CloseShieldInputStream (commons.apache.org/io/apidocs/org/apache/commons/io/input/) - person AgentM; 17.06.2020

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

(Оффтоп: вместо «количество» слово «количество» было бы более уместно использовать для количества игроков. Английский не мой родной язык (я голландец), и я совершал точно такую ​​же ошибку.)

person Henno Vermeulen    schedule 28.11.2014

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

try(Scanner sc = new Scanner(System.in)) {

    //Use sc as you need

} catch (Exception e) {

        //  handle exception

}
person Priyantha    schedule 22.07.2017

Попробуй это

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).");
person tmwanik    schedule 25.03.2013