当前位置: 首页 > 知识库问答 >
问题:

try-catch块中线程“main”出现异常错误[重复]

邢炯
2023-03-14

当我试图让用户重新输入一个数字时,会出现这个错误。

while(guess != num) {
    System.out.println("Guess a number between 1 and 10.");
    try{
        guess = scan.nextInt();
    }catch(Exception e) {
        System.out.println("Enter a valid number.");
        guess = scan.nextInt();
    }
}

错误显示在guess=scan的下一次迭代中。nextInt();

输入/输出:

Guess a number between 1 and 10.
d
Enter a valid number.
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at HiLo.main(HiLo.java:19)

我只是重新学习Java,任何帮助都很感激。

共有2个答案

司马同
2023-03-14

在读取任何不是整数的字符后,由Scanner实例的方法nextInt引发。Java中整数变量(int)的最大和最小大小也必须考虑。

这个问题有点不清楚,但是从给定的代码和示例用户输入中,我猜测目标是让用户重新输入一个数值,直到键入所需的数字,同时通知用户错误的输入类型。

以下是实现这一目标的方法:

public class NumberGuessing {
    public static void main(String[] args) {
        int guess = -1;
        int num = 9;
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("Guess a number between 1 and 10.");
            String enteredValue = scan.next();
            while(!validNumber(enteredValue)) {
                System.out.println("Enter a valid number.");
                enteredValue = scan.next();
            }
            guess = Integer.parseInt(enteredValue);
            if (guess == num) {
                System.out.println("That's right! The hidden number was: " + num);
                break;
            }
        }
    }
    private static boolean validNumber(String s) {
        try{
            int num = Integer.parseInt(s);
            return num >= 1 && num <= 10; //change this to `return true;` if range check is not needed
        }catch(NumberFormatException e) {
            return false;
        }
    }
}

它使用Scanner实例的方法next()的原因是nextInt只读取它看到的第一个字符串,而不读取新行字符。因此,当使用内部的nextInt循环时,下一次迭代将尝试读取新行字符,这也将导致输入不匹配异常。

最好从控制台读取整行Next(),然后解析它,使输入符合用户需求。

Edit2:如果不需要范围检查,您可以使用正则表达式检查:

while (guess != num) {
    System.out.println("Guess a number between 1 and 10.");
    String enteredValue = scan.next();
        while (!enteredValue.matches("-?\\d+")) {
        System.out.println("Enter a valid number.");
        enteredValue = scan.next();
    }
    guess = Integer.parseInt(enteredValue);
}

它允许在某些情况下可能不是有效数字的数字中使用前导“0”,如果要避免前导“0”,请将匹配方法更改为。匹配(“-?(0 |[1-9]\\d*)”

邢和光
2023-03-14

因此,您的catch语句在技术上处理异常,但是如果您没有输入数字(try{1}中的扫描行),它仍然会抛出原始异常。您必须在catch语句中调用scan.next();。Java扫描器就是这样奇怪的。

while(guess != num) {
         System.out.println("Guess a number between 1 and 10.");
         try{
            guess = scan.nextInt();
         }catch(Exception e) {
            System.out.println("Enter a valid number.");
            scan.next();
         }
      }

这应该行得通。

 类似资料:
  • 我的代码中出现了这个错误。 这是我的代码: 这就是结果。错误:在线程“main”java中输入model:Exception。lang.NullPointerException在汽车上。主(车.java:10)

  • 不断得到这个错误,不确定为什么有人可以帮助:

  • 我对Java非常陌生,似乎遇到了一些奇怪的错误。我到处寻找解决方案,我遇到的所有解决方案都与我已有的完全相同。 我已经编写了一个类,将目的地添加到ArrayList,但它不起作用。 我得到了这个错误:“线程中的异常”main“java.lang.NullPointerException” 这是我的代码: 我试图添加到ArrayList的数据的代码是这样的: 它退出方法中的程序,并且不将目标添加到数

  • 我在线程“main”java中遇到异常。错误:未解析编译。 我做错了什么? 线程“main”中出现异常: java.lang.错误:未解决的编译问题: 对于类型在

  • 我正在通过selenium学习自动化测试教程,并且正在用java语言编写我的第一个脚本,并且在Eclipse的“控制台”中得到了这条消息。 我的代码: 教程链接:http://toolsqa.wpengine.com/selenium-webdriver/first-test-case/

  • 我从GitHub克隆了我的项目,现在我无法运行我的项目。 我收到以下错误: 知道是什么导致了这个错误吗? 编辑 我检查了这个问题Intellij在我发布到这里之前突然抛出ClassNotFoundException,它没有给我任何解决方案...为什么要将我的问题标记为重复,因为那个问题不能解决我的问题?