验证输入并阻止try / catch退出

时间:2017-09-01 13:25:15

标签: java validation exception input while-loop

我是java的新手,但我已经对这个特定的程序做了很多实验,而且我已经碰壁了。此程序的目的是捕获用户是否输入超出变量限制的值,以及验证输入是否满足我指定的范围。

  • 如果输入超过变量限制而没有while循环,则程序退出。
  • 如果输入超过带有while循环的变量限制,它将无限循环。

我尝试过使用while循环,我的三个结果就是:

  1. 用户输入程序员指定的有效数字,一切正常。
  2. 用户输入的数字大于100,系统会提示您再试一次......
  3. 用户超出变量限制,程序进入 无限循环。
  4. 如果我在catch块中放置一个转义,它就像while不在那里一样。我希望程序打印错误,但允许用户重试一个值。

    while(!success){
        try{
            sh = sc.nextShort();
            while(sh < 1 || sh > 100){
                System.out.print("You must enter a value between 1-100: ");
                sh = sc.nextShort();
            } //close try
            System.out.println("Great job!");
            success = true; //escape the while
        }catch{Exception ex){
            System.out.println("ERROR: " + ex);
            success = false; //causes infinite loop... I understand
        } //close catch
    } //close while
    

3 个答案:

答案 0 :(得分:1)

正如我理解你的问题,你在传递一个更大的价值(更强大的东西,如例如&#34; 10000000000&#34; )时面临一个例外循环。

在无限循环中你有以下例外情况:

ERROR: java.util.InputMismatchException: For input string: "10000000000"
ERROR: java.util.InputMismatchException: For input string: "10000000000"

但您希望程序打印例外行,然后允许用户再次输入。

您可以通过以下方式从您使用的扫描仪中读取错误输入( String bad_input = sc.next();)

 while (!success) {
                  try {
                        sh = sc.nextShort();
                        while (sh < 1 || sh > 100) {
                              System.out.print("You must enter a value between 1-100: ");
                              sh = sc.nextShort();
                        } // close try
                        System.out.println("Great job!");
                        success = true; // escape the while
                  } catch (Exception ex) {
                        System.out.println("ERROR: " + ex);
                        success = false; // causes infinite loop... I understand
                        String bad_input = sc.next();// your bad input to allow read that exception
                  } // close catch
            } // close while

可以找到此问题的原因here

  

如果翻译成功,扫描仪将超过输入   匹配

答案 1 :(得分:1)

问题是,Scanner存储整个输入字符串并对其进行处理。 当您的输入不是短值而是字符串时,它会抛出异常。您在catch中记录异常,并在下一个循环中尝试从同一个存储的字符串中读取一个短值,这会再次引发异常.... - &gt;无限循环。

如果您在catch中创建一个新的Scanner,它将再次从控制台读取:

while (!success) {
        try {
            sh = sc.nextShort();
            while (sh < 1 || sh > 100) {
                System.out.print("You must enter a value between 1-100: ");
                sh = sc.nextShort();
            } //close try
            System.out.println("Great job!");
            success = true; //escape the while
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex);
            sc = new Scanner(System.in);
        } //close catch
    }

答案 2 :(得分:0)

如果我理解你的问题,你可以摆脱你的第二个while循环,并用if替换它。然后你可以打印出值必须为1-100并抛出异常以使程序通过catch语句并打印出你输出的错误。

IsDisabled