2013-03-29 65 views
1

你好,我運行此代碼:以後Java異常錯誤打印

public static int chooseOption() { 
    int choice = 0; 
    System.out.println("Enter number [1, 2, 3..]"); 

    do { 
     try { 
      choice = sc.nextInt(); 
     } catch (java.util.InputMismatchException e) { 
      System.out.println(e); 
      break; 
     } 
    } while(choice == 0 || choice < 0); 


    return choice; 
} 


public static String chooseCom() { 
    String choice = new String(); 
    int commNumber = 0; 

    System.out.println("Choose your COM port"); 
    commNumber = chooseOption(); 

    choice = "COM" + commNumber; 
    System.out.println(choice); 
    return choice; 
} 

我打電話 - >

Helper.chooseOption(); 

Helper.chooseCom(); 

,當我寫在第一次通話1.1或只是一個錯誤的浮動(雙倍)值的輸出是:

Enter number [1, 2, 3..] 
1.1 
java.util.InputMismatchException 
Choose your COM port 
Enter number [1, 2, 3..] 
java.util.InputMismatchException 
COM0 

第二個java.util.Input ..問題是爲什麼當我在第一次調用時寫錯號碼時他彈出?

+0

什麼是'sc'?它的定義在哪裏,它有什麼內容? –

+0

請張貼更多您正在使用的代碼,因爲在這裏似乎不足以提供派生的答案。 – david99world

+1

@JohnKugelman看起來像一個'java.util.Scanner' –

回答

3

當給定的輸入與期望的輸入不符時,nextInt不會消耗輸入。 From the documentation

當掃描器拋出InputMismatchException時,掃描儀將不會通過引起異常,這樣它可以被檢索或通過一些其它方法跳過令牌。

的溶液跳過趕超子句中的無效輸入,例如用nextLine

try { 
     choice = sc.nextInt(); 
    } catch (java.util.InputMismatchException e) { 
     System.out.println(e); 
     sc.nextLine(); // skip the entire line 
     break; 
    } 
3

假設scjava.util.Scanner ...

掃描器類作品(概念上)將輸入分解爲令牌,然後處理令牌。如果在下一個標記與整數的語法不匹配時調用sc.nextInt(),則該調用將拋出該異常。

但是,如果nextXxx方法拋出異常,它不會「消耗」下一個標記。相反,它會將其保留在掃描器的標記流中......因此,當您再次調用sc.nextInt()時,它將嘗試再次解析相同的標記並拋出相同的異常。

要放棄令牌,您需要致電sc.next()。或者如果你想丟棄整條線路,請致電sc.nextLine()

+0

我明白了,是的,謝謝很多修正:) – Stuci