2016-08-17 4 views
-1

Может кто-нибудь сказать мне, что не так с моим кодом, как показано ниже? Первый случай работает отлично, но второй и третий случай выдает исключение:Что не так с моим кодом сканера?

Связано ли это с петлями while в начале корпуса 2 и 3?

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    int option = scan.nextInt(); 

    switch (option) { 
     case 1: int line = scan.nextInt(); 
       for (int i = 0; i < line; i++){ 

        String operator = scan.next(); 

        int n1 = scan.nextInt(); 
        int n2 = scan.nextInt(); 

        Boolean no1 = (n1 == 1) ? true:false; 
        Boolean no2 = (n2 == 1) ? true:false; 

        if (operator.equals("AND")) { 
         int result = (no1 && no2) ? 1:0; 
         System.out.println(result); 
        } else { 
         int result = (no1 || no2) ? 1:0; 
         System.out.println(result); 
        } 

       } 
       break; 
     case 2: while (!scan.nextLine().equals("0")) { 
        String operator = scan.next(); 

        int n1 = scan.nextInt(); 
        int n2 = scan.nextInt(); 

        Boolean no1 = (n1 == 1) ? true:false; 
        Boolean no2 = (n2 == 1) ? true:false; 

        if (operator.equals("AND")) { 
         int result = (no1 && no2) ? 1:0; 
         System.out.println(result); 
        } else { 
         int result = (no1 || no2) ? 1:0; 
         System.out.println(result); 
        } 

       } 
       break; 
     case 3: while (scan.hasNextLine()) { 
        String operator = scan.next(); 

        int n1 = scan.nextInt(); 
        int n2 = scan.nextInt(); 

        Boolean no1 = (n1 == 1) ? true:false; 
        Boolean no2 = (n2 == 1) ? true:false; 

        if (operator.equals("AND")) { 
         int result = (no1 && no2) ? 1:0; 
         System.out.println(result); 
        } else { 
         int result = (no1 || no2) ? 1:0; 
         System.out.println(result); 
        } 
       } 
       break; 
     default: System.out.println("Error"); 
       break; 
    } 
} 

Исключение в потоке "основного" java.util.NoSuchElementException

в java.util.Scanner.throwFor (Scanner.java:862)

в java.util.Scanner. следующий (Scanner.java:1371)

на HelloWorld.main (HelloWorld.java:64)

+0

Исключение составляет java.util.NoSuchElementException –

+0

Пожалуйста, отредактируйте ваш вопрос, чтобы включить полную статистику стека любых ошибок, которые вы получаете. – azurefrog

+0

Возможный дубликат [NoSuchElementException с Java.Util.Scanner] (http://stackoverflow.com/questions/13729294/nosuchelementexception-with-java-util-scanner) – David

ответ

0

В случае 2: ​​

while (scan.nextLine().equals("0")) 

Приведенная выше строка читает следующую строку. Тогда в следующий раз, когда вы позвоните scan.next(), у вас может не получиться что-нибудь прочитать. Вот почему вы получаете исключение java.util.NoSuchElementException.

В цикле while проверьте scan.hasNext(). Затем внутри цикла while прочитайте ввод и проверьте, равно ли оно 0.

while (!scan.hasNext()) { 
    String operator = scan.next(); 
    if (operator.equals("0")) break; 
    int n1 = scan.nextInt(); 
    int n2 = scan.nextInt(); 

    boolean no1 = (n1 == 1) ? true:false; 
    boolean no2 = (n2 == 1) ? true:false; 

    if (operator.equals("AND")) { 
      int result = (no1 && no2) ? 1:0; 
      System.out.println(result); 
    } else { 
      int result = (no1 || no2) ? 1:0; 
      System.out.println(result); 
    } 

} 
break; 
+0

Я пробовал делать, как указано выше, и программа запускается, но есть нет выхода. Для проверки моей программы я использую следующий код: 'java HelloWorld < hello.in > output.out' В файле hello.in для case2 содержит: 2 \ nOR 0 1 \ nAND 0 0 \ n0 –

+0

Я не вызывал scan.nextLine() причину this^@ 11thdimension –

+0

Ошибка в коде выше, это должно быть while (scan.hasNext()) not! scan.hasNext(). Исправлено, что и случай 2 работает отлично :) –

0

Scanner.nextInt() не будет использовать новую строку, за которой следует.

Именно поэтому scan.nextLine() звонок во втором случае будет потреблять \n, один новый символ линии, делая условие true.

Таким образом, введенный "0" по-прежнему не потребляется и будет идти в operator, вход, предназначенный для оператора, будет строкой и не будет использоваться scan.nextInt(), это ошибка.

Чтобы исправить это, позвоните по телефону scan.nextLine() после первого звонка scan.nextInt().