2016-08-17 20 views
-1

有人可以告訴我我的代碼有什麼問題,如下所示?第一種情況非常好,但第二種和第三種情況引發異常:我的掃描儀代碼有什麼問題?

這是否與情況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; 
    } 
} 

異常在線程 「主」 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()cause這個^ @ 11thdimension –

+0

在上面的代碼中有一個錯誤,它應該是while(scan.hasNext())而不是!scan.hasNext()。修正了案例2運行良好:) –

0

Scanner.nextInt()不會消耗後面跟着的新行。

這就是爲什麼scan.nextLine()在第二種情況下調用將消耗\n,一個單一的新行字符,使得條件爲true

因此輸入"0"仍然沒有被使用,並且會進入operator,輸入意味着操作符將是一個字符串,並且不會被scan.nextInt()消耗,這是錯誤。

要解決此問題,請在撥打第一個scan.nextInt()後致電scan.nextLine()