2017-02-16 98 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();