我的扫描仪代码出了什么问题?

时间:2016-08-17 18:01:30

标签: java java.util.scanner

有人能告诉我我的代码有什么问题,如下所示?第一种情况完全正常,但第二种和第三种情况引发了异常:

这是否与案例2和3开头的while循环有关?

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;
    }
}
  

线程“main”中的异常java.util.NoSuchElementException

     

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

     

在java.util.Scanner.next(Scanner.java:1371)

     

在HelloWorld.main(HelloWorld.java:64)

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

Scanner.nextInt()不会消耗后面的新行。

为什么scan.nextLine()在第二种情况下调用会消耗\n,一个新行字符,使得while条件为true

因此输入的"0"仍然没有被消耗并进入operator,对于运算符意味着的输入将是一个字符串并且不会被scan.nextInt()消耗,这就是错误。

要解决此问题,请在第一次scan.nextLine()来电后致电scan.nextInt()