如何使用scanner处理无效输入(inputmismatchexception)引起的无限循环

p4tfgftt  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(448)

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

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;
    }
}

这是我的输出:
插入整数:
无效值!
插入整数:
无效值!
...

yfjy0ee7

yfjy0ee71#

whiledo的保护是“loop”变量。
在代码到达赋值循环之前抛出的异常本身=false;准确地说,异常是在前面的语句num=reader.nextint()中抛出的;
当抛出异常时,“loop”变量的值为“true”,但您的代码跳转到catch块,然后重复while do。这个whiledo永远不会停止,因为下一次迭代将再次抛出异常,再次跳转到catch块等等。
要终止此while do,您需要使用另一个逻辑操作来保护while do,例如:
当读卡器获取非整数字符时退出
eof时退出
这可以在catch block或其他行中完成。但精确的解决方案取决于您的规格。

kkbh8khc

kkbh8khc2#

package nzt.nazakthul.app;

import java.util.*;

public class NztMainApp {

    public static void main(String[] args) {
    ReadNumber readObj = new ReadNumber();
    readObj.readNumber();
    }

}

class ReadNumber {
int no;

    int readNumber() {
    Scanner number = new Scanner(System.in);
    int no=0;
    boolean b=true;
    do {

        try {
            System.out.print("Enter a number:\t");
            no = number.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("No Number");
            //e.printStackTrace();

            b=false;
        }

    }

    while (b);
    return no;

    }

}

就我个人而言,我使用bufferedreader和inputstreamreader来读取字符串并检查是否是一个数字,但使用scanner的代码更少。代码已检查并正常运行。

omhiaaxx

omhiaaxx3#

您也可以尝试以下方法:

public int readInt(String msg) {
        int num = 0;
        try {
            System.out.println(msg);
            num = (new Scanner(System.in)).nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Invalid value!");
            num = readInt(msg);
        } 
        return num;
    }
ddarikpa

ddarikpa4#

根据扫描仪的javadoc:
当扫描器抛出inputmismatchexception时,扫描器不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。
这意味着如果下一个令牌不是 int ,它抛出 InputMismatchException ,但令牌留在那里。所以在循环的下一次迭代中, reader.nextInt() 再次读取相同的令牌并再次抛出异常。你需要的是用完它。添加 reader.next() 在你的 catch 使用令牌,该令牌无效,需要丢弃。

...
} catch (InputMismatchException e) {
    System.out.println("Invalid value!");
    reader.next(); // this consumes the invalid token
}
qq24tv8q

qq24tv8q5#

我要做的是使用scanner.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;
    }

这样你就有了一个扫描仪来获取输入,还有一个对输入进行验证,这样你就不用担心读者会关心他们是否输入了正确的输入格式。

相关问题