如何使用扫描器处理由无效输入(InputMisameException)引起的无限循环

如何使用扫描器处理由无效输入(InputMisameException)引起的无限循环

所以,我被这段代码卡住了:

import java.util.InputMismatchException;import java.util.Scanner;public class ConsoleReader {

    Scanner reader;

    public ConsoleReader() {
        reader = new Scanner(System.in);
        //reader.useDelimiter(System.getProperty("line.separator"));
    }

    public int readInt(String msg) {
        int num = 0;
        boolean loop = true;

        while (loop) {
            try {
                System.out.println(msg);
                num = reader.nextInt();

                loop = false;
            } catch (InputMismatchException e) {
                System.out.println("Invalid value!");
            } 
        }
        return num;
    }}

这是我的输出:

插入整数:
无效值!
插入整数:
无效值!
...


慕慕森
浏览 669回答 4
4回答

牧羊人nacy

根据javadoc扫描仪:当扫描器抛出InputMisameException时,扫描器将不会传递导致异常的令牌,从而可以通过其他方法检索或跳过该令牌。这意味着如果下一个令牌不是int,它抛出InputMismatchException但象征性的留在那里。所以在循环的下一次迭代中,reader.nextInt()再次读取相同的令牌并再次抛出异常。你需要的是使用它。加一个reader.next()在你的catch若要使用令牌,则该令牌无效,需要丢弃。...} catch (InputMismatchException e) {     System.out.println("Invalid value!");     reader.next(); // this consumes the invalid token}

精慕HU

我要做的是使用Scaner.nextLine()在整行中阅读。然后创建另一个读取返回字符串的扫描器。String line = reader.nextLine();Scanner sc = new Scanner(line);这将使您的示例函数如下所示:  public int readInt(String msg) {         int num = 0;         boolean loop = true;         while (loop) {             try {                 System.out.println(msg);                 String line = reader.nextLine();                 Scanner sc = new Scanner(line);                 num = sc.nextInt();                    loop = false;             } catch (InputMismatchException e) {                 System.out.println("Invalid value!");             }          }         return num;     }这样,你就有一个扫描器来获取输入,另一个来验证它,这样你就不用担心读者是否关心他们是否输入了正确的输入形式。

料青山看我应如是

你的自行其是“循环”变量。在代码到达赋值循环=false之前抛出的异常本身;准确地说,异常是在前面的语句(num=reader.nextInt()中抛出的;当抛出异常时,“循环”变量的值为“true”,但您的代码会跳转到捕捉块,然后重复while-do。这个时间-做永远不会停止,因为下一次迭代将再次抛出一个异常,跳到捕获块,等等。要终止这个What-do,您需要使用另一个逻辑操作来保护自己的时间,例如:读取器获得非int字符时退出EOF时退出这可以在CATCH块或其他行中完成。但精确的解决方案取决于您的规格。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java