2012-10-03 107 views
16

所以我正在構建一個程序,從用戶輸入採取整數。我有什麼似乎是一個非常直接的try/catch塊,如果用戶沒有輸入一個int,應該重複該塊直到他們這樣做。下面的代碼的相關部分:嘗試/趕上與InputMismatchException創建無限循環

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class Except { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     boolean bError = true; 
     int n1 = 0, n2 = 0, nQuotient = 0; 

     do { 
      try { 
       System.out.println("Enter first num: "); 
       n1 = input.nextInt(); 
       System.out.println("Enter second num: "); 
       n2 = input.nextInt(); 
       nQuotient = n1/n2; 
       bError = false; 
      } 
      catch (Exception e) { 
       System.out.println("Error!"); 
      } 
     } while (bError); 

     System.out.printf("%d/%d = %d",n1,n2, nQuotient); 
    } 
} 

如果我的第二個整數輸入0,那麼try/catch語句不正是它應該和讓我再次把它英寸但是,如果我通過爲其中一個數字輸入5.5而導致InputMismatchException,它只是在無限循環中顯示我的錯誤消息。爲什麼會發生這種情況,我能做些什麼呢? (順便說一下,我試圖明確打字InputMismatchException時能趕上的說法,但它並沒有解決問題。

回答

24

你需要調用next();,當你得到了錯誤。另外,建議使用hasNextInt()

 catch (Exception e) { 
      System.out.println("Error!"); 
      input.next();// Move to next other wise exception 
     } 

之前閱讀整數值,你需要確保掃描儀有一個,而你並不需要異常處理這樣的。

Scanner scanner = new Scanner(System.in); 
    int n1 = 0, n2 = 0; 
    boolean bError = true; 
    while (bError) { 
     if (scanner.hasNextInt()) 
      n1 = scanner.nextInt(); 
     else { 
      scanner.next(); 
      continue; 
     } 
     if (scanner.hasNextInt()) 
      n2 = scanner.nextInt(); 
     else { 
      scanner.next(); 
      continue; 
     } 
     bError = false; 
    } 
    System.out.println(n1); 
    System.out.println(n2); 

的Javadoc Scanner

當掃描器拋出InputMismatchException時,掃描器不會傳遞導致異常的令牌,以便通過其他方法檢索或跳過該令牌。

+1

這真的太棒了,謝謝!你能否詳細解釋爲什麼你需要'next()'命令?我有一些想法,但對我來說有點不清楚。 –

+0

@limp_chimp更新了問題。 –

1

由於bError = false聲明try block從未達到,並聲明是來襲採取輸入,它使打印錯誤的無限循環

使用hasNextInt()

catch (Exception e) { 
      System.out.println("Error!"); 
      input.hasNextInt();   
     } 

嘗試使用這種方式,或者嘗試使用nextLine()加上Integer.parseInt()採取輸入....

Scanner scan = new Scanner(System.in); 

int num1 = Integer.parseInt(scan.nextLine()); 
int num2 = Integer.parseInt(scan.nextLine()); 
1

爲了補充AmitD答案:

只需複製/粘貼您的程序並輸出:

Error! 
Enter first num: 
.... infinite times .... 

正如你所看到的,指令:

n1 = input.nextInt(); 

不斷拋出異常時輸入的雙號,那是因爲你的流不會被清零。要修復它,請按照AmitD的答案。

1

@Limp,你的回答是正確的,只需在閱讀輸入時使用.nextLine()。示例代碼:

do { 
     try { 
      System.out.println("Enter first num: "); 
      n1 = Integer.parseInt(input.nextLine()); 
      System.out.println("Enter second num: "); 
      n2 = Integer.parseInt(input.nextLine()); 
      nQuotient = n1/n2; 
      bError = false; 
     } catch (Exception e) { 
      System.out.println("Error!"); 
     } 
    } while (bError); 

    System.out.printf("%d/%d = %d", n1, n2, nQuotient); 

請閱讀描述爲什麼在下面的鏈接中導致此問題。尋找我在這個帖子中發佈的詳細信息。 Java Homework user input issue

好的,我會簡單介紹一下。當您使用nextInt()讀取輸入時,您只是讀取數字部分,但ENDLINE字符仍在流中。這是主要原因。現在看一下上面的代碼,我所做的只是讀取整個行並解析它,它仍會拋出異常並以您期望的方式工作。其餘的代碼工作正常。

2

還可以嘗試以下

do { 
     try { 
      System.out.println("Enter first num: "); 
      n1 = Integer.parseInt(input.next()); 

      System.out.println("Enter second num: "); 
      n2 = Integer.parseInt(input.next()); 

      nQuotient = n1/n2; 

      bError = false; 
     } 
     catch (Exception e) { 
      System.out.println("Error!"); 
      input.reset(); 
     } 
    } while (bError); 
2

另一個選擇是定義掃描儀輸入=新掃描儀(System.in);在try塊內部,每次需要重新輸入值時,這將創建一個新對象。

2

要遵循debobroto DAS的回答,您還可以把後

input.reset(); 
input.next(); 

我有同樣的問題,當我嘗試這樣做。它完全解決了它。