Пустой ввод со сканера - java

Что я пытаюсь сделать, так это то, что если пользователь нажимает клавишу ввода, программа должна генерировать исключение BadUserInputException. Моя проблема в том, что всякий раз, когда я нажимаю клавишу ввода, я просто помещаю меня в другую строку консоли, по сути ничего не делая.

Scanner input = new Scanner(System.in);
    System.out.println("Enter Student ID:");

    String sID = null;
    if (input.hasNextInt()==false){
        System.out.println("Please re-check the student number inputted. Student number can only be digits.");
        throw new BadUserInputException("Student number can not contain non-digits.");
    }else if (input.next()==""){
        throw new BadUserInputException("Student number can not be empty");
    }

person Joel Sanchez    schedule 16.04.2011    source источник
comment
next() сканера - это метод ожидания блока, который блокируется до тех пор, пока вы не получите какой-либо ввод, поэтому вы никогда не попадете во второй оператор if, в этом случае вам, вероятно, потребуется использовать некоторые классы потокового ввода, которые намного надежнее, чем сканер .   -  person Rn2dy    schedule 17.04.2011


Ответы (4)


Я столкнулся с этой точной проблемой, и я считаю, что нашел решение.

Суть в том, чтобы принять ввод как тип String и использовать метод .isEmpty(), чтобы проверить, ввел ли пользователь что-нибудь или нет.

Если ваша строка называется "cheese", а ваш сканер называется "in", вот как это выглядит:

cheese = ""; // empty 'cheese' of prior input
cheese = in.nextLine(); //read in a line of input

//if user didn't enter anything (or just spacebar and return)
if(cheese.isEmpty()) {
System.out.println("Nothing was entered. Please try again");
} 
//user entered something
else {
[enter code here checking validity of input]
}

Я попытался реализовать эту проверку для целочисленного ввода и обнаружил, что лучше принимать ввод типа String и преобразовывать его в тип int с помощью класса-оболочки. Если у тебя есть

int eger = 0; //initialize to zero

тогда вы должны поместить этот код в оператор else выше:

else{
eger = Integer.valueOf(cheese);
}

Я знаю, что этот вопрос был задан 2 года назад, но я разместил его в надежде помочь другим, таким как я, которые искали ответ. :)

person YJ Choi    schedule 06.07.2013

Сканер ищет токены между пробелами и символами новой строки, но их нет. Я не склонен использовать Scanner для чтения из стандартного ввода — я использую старомодный метод BufferedReader следующим образом:

BufferedReader buf = new BufferedReader (new InputStreamReader (System.in));

и тогда я могу сказать

String line = buf.readLine ();
if (line.equals ("")) blah();

Однако может быть более простое решение.

person Robin Green    schedule 16.04.2011

Просто используйте метод nextLine() вместо next() при сканировании строки и, наконец, проверьте строку с помощью метода isEmpty(). Это сработало для меня.

person Kiara    schedule 25.03.2016

Вам нужно сравнивать строки с помощью метода .equals, а не ==.

person Robin Green    schedule 16.04.2011
comment
Я все еще получаю то же самое. Когда я нажимаю ввод, я просто переношу меня на одну строку вниз, чтобы я мог что-то ввести. - person Joel Sanchez; 17.04.2011