2017-02-16 100 views
1

算法應將3個整數存入ArrayList中。如果輸入不是整數,那麼應該有一個提示。當我執行我的代碼時,執行catch子句,但程序運行到無限循環。有人能引導我走向正確的方向,我很感激幫助。 :-D使用Java中的do-while循環進行異常處理

package chapter_08; 
import java.util.Scanner; 
import java.util.List; 
import java.util.ArrayList; 

public class IntegerList { 
    static List<Integer> numbers = new ArrayList<Integer>(); 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int counter = 1; 
     int inputNum; 

     do { 
      System.out.print("Type " + counter + " integer: "); 
      try { 
       inputNum = input.nextInt(); 
       numbers.add(inputNum); 
       counter += 1; 
      } 
      catch (Exception exc) { 
       System.out.println("invalid number"); 
      } 
     } while (!(numbers.size() == 3)); 
    } 
} 

回答

3

這是因爲當使用nextInt()讀取下一個int並且失敗時,Scanner仍包含鍵入的內容。然後,當重新進入do-while循環時,input.nextInt()嘗試使用相同的內容再次解析它。

你需要 '沖洗' 的Scanner內容與nextLine()

catch (Exception exc) { 
    input.nextLine(); 
    System.out.println("invalid number"); 
} 

注:

  • 可以刪除counter變量,因爲你不使用它。否則,您可以用counter++代替counter += 1
  • 您可以使用while (numbers.size() != 3)替代while (!(numbers.size() == 3)),或者更好:while (numbers.size() < 3)
  • 捕捉異常時,應儘可能具體,除非您有充分理由不這樣做。 Exception應該替換爲InputMismatchException你的情況。
0

你應該在你的catch(){}使用break;像這樣:

try { 
    inputNum = input.nextInt(); 
    numbers.add(inputNum); 
    counter += 1; 
} catch (Exception e) { 
    System.out.println("invalid number "); 
    break; 
} 

所以,如果一個輸入不正確打破你的循環。

1

如果inputNum = input.nextInt();無法放入int並且InputMismatchException被觸發,則不會消耗Scanner的輸入。

所以抓後,其循環和它會再次在這裏:

inputNum = input.nextInt(); 

與準確輸入相同的內容。

因此,您應該在catch語句中執行input.nextLine();以放棄當前輸入並允許來自用戶的新輸入。
除了它更有意義趕上InputMismatchException而非Exception其他例外與不匹配沒有關係可能發生,如果它是不是問題就不會顯示給用戶"invalid number "有用:

catch (InputMismatchException e){ 
     System.out.println("invalid number "); 
     input.nextLine(); 
    } 
0

嘗試改變

inputNum = input.nextInt(); 

String inputText=input.next(); 
inputNum = Integer.valueOf(inputText); 

它工作得很好。

0

您需要將掃描儀移動到下一行。在catch部分的錯誤消息下面添加這行代碼。

input.nextLine();