2015-06-20 5 views
0

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

public class Test{ 
    public static void main(String[] args) { 
     String userInput1 = getUserInput(); 
     System.out.println(userInput1); 
     String userInput2 = getUserInput(); 
     System.out.println(userInput2);  
    } 

private static String getUserInput() { 
     System.out.println("Enter the String"); 
     Scanner scanner = new java.util.Scanner(System.in); 
     String input = scanner.next(); 
     scanner.close(); 
     return input; 
    } 
} 

Первый вызов к методу getUserInput удалось без issues.But он второй инвольтация бросил NoSuchElementException.

Enter the String 
test1 
test1 
Enter the String 
Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:862) 
    at java.util.Scanner.next(Scanner.java:1371) 

ответ

0

Есть две проблемы с кодом

  1. Это предполагает, что уже было введено. Простой while(!scanner.hasNext()){} до того места, где вы звоните scanner.next(); должно работать.

  2. Вы создаете много сканеров (это может или не может повлиять на код, но эффективность воздействия) Вместо этого Scanner scanner = new Scanner(System.in); можно разбить на декларацию (Scanner scanner;) вне метода, а затем определяется (scanner = new Scanner(System.in);) в основной метод или код инициализации.

+0

Вызов 'hasNext' и' next' на 'System.in' имеет тот же эффект: эти вызовы блокируют поток до тех пор, пока не будет прочитан токен. Поэтому нет смысла использовать этот цикл while. – Tom

+0

@Tom Но вы можете использовать его для проверки типа ввода («введите номер», когда кто-то набирает строку) –

+0

Итак, somthing like 'System.out.print (« введите число: »); в то время как (! scanner.hasNextInt()) {} '? Это плохая идея для проверки типов. Вы можете попробовать, чтобы узнать, почему. – Tom

Смежные вопросы