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

为什么我会收到输入不匹配异常?

公西马鲁
2023-03-14

到目前为止,我有这个:

public double checkValueWithin(int min, int max) {
    double num;
    Scanner reader = new Scanner(System.in);
    num = reader.nextDouble();                         
    while (num < min || num > max) {                 
        System.out.print("Invalid. Re-enter number: "); 
        num = reader.nextDouble();                         
    }
    return num;
}

和这个:

public void askForMarks() {
    double marks[] = new double[student];
    int index = 0;
    Scanner reader = new Scanner(System.in);
    while (index < student) {
        System.out.print("Please enter a mark (0..30): ");
        marks[index] = (double) checkValueWithin(0, 30); 
        index++;
    }
}

当我测试这个时,它不能采取双倍数字,我收到这个消息:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextDouble(Scanner.java:2456)
at MarkingSystem.checkValueWithin(MarkingSystem.java:25)
at MarkingSystem.askForMarks(MarkingSystem.java:44)
at World.main(World.java:6)
Java Result: 1

我该如何解决这个问题?

共有3个答案

陈文景
2023-03-14

我遇到了同样的问题。奇怪,但原因是对象扫描仪根据系统的本地化来解释分数。如果当前本地化使用逗号分隔分数的各个部分,带点的分数将变成字符串类型。因此错误…

梁英喆
2023-03-14

在这里您可以看到扫描仪的性质:

双下双()

以双精度形式返回下一个令牌。如果下一个标记不是浮点数或超出范围,将引发InputMismatchException。

尝试捕捉异常

try {
    // ...
} catch (InputMismatchException e) {
    System.out.print(e.getMessage()); //try to find out specific reason.
}

更新

案例1

我试过你的代码,没有错。您收到该错误是因为您必须输入String值。当我输入一个数值时,它运行时没有任何错误。但一旦我输入String,它就会抛出与您在问题中提到的相同的异常

案例2

你输入了一些东西,超出了我上面提到的范围。

我真的很好奇你会尝试输入什么。在我的系统中,它运行得很好,没有修改一行代码。只是照原样复制,并尝试编译和运行它。

import java.util.*;

public class Test {
    public static void main(String... args) {
        new Test().askForMarks(5);
    }

    public void askForMarks(int student) {
        double marks[] = new double[student];
        int index = 0;
        Scanner reader = new Scanner(System.in);
        while (index < student) {
            System.out.print("Please enter a mark (0..30): ");
            marks[index] = (double) checkValueWithin(0, 30); 
            index++;
        }
    }

    public double checkValueWithin(int min, int max) {
        double num;
        Scanner reader = new Scanner(System.in);
        num = reader.nextDouble();                         
        while (num < min || num > max) {                 
            System.out.print("Invalid. Re-enter number: "); 
            num = reader.nextDouble();                         
        } 

        return num;
    }
}

如您所说,您已经尝试输入< code>1.0 、< code>2.8等。请尝试使用此代码。

注意:请在单独的行中逐个输入数字。我的意思是,输入2.7,按enter,然后输入第二个数字(例如6.7

孟安民
2023-03-14

与其使用点,如:1.2,不如尝试这样输入:1,2。

 类似资料:
  • 我对Scanner有一个问题,因为它似乎采用输入值类型并强制用户下次输入值为相同类型。我找不到此代码不起作用的任何原因,并给我一个InputMismatchException,因为我已经编写了一百万次这样的代码并且没有问题。 这个问题不仅仅是register()方法的问题,而是整个程序的问题,例如下面的代码: 如果其中一种方法(如 register)要求用户输入字符串,则 int user=inp

  • (更新的代码)无论出于什么原因,InputMismatchException的catch块无法正常工作。当代码抛出此错误时,catch块不会捕获它。有人知道为什么会这样吗?

  • 问题内容: 为什么在代码的指定位置出现ConcurrentModificationException?我无法弄清楚自己在做什么错… 正在使用该方法在列表中找到分钟,将其删除并返回其值 问题答案: 一旦修改了从其获得的Collection,则不应认为Iterator可用。(对于java.util.concurrent。*集合类,放宽了此限制。) 您首先要获得一个Iterator ,然后进行修改。修改

  • 问题内容: 请问为什么第13行中的错误是未报告的异常,必须在声明声明为pr的情况下将其捕获 问题答案: 您需要向引发异常的方法中添加一个,如上所述,以及调用该方法的所有方法

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl

  • 获取此语句时出错。deleteEntry(Integer.valueOf); 如果在执行dao.delete项(Integer.valueOf(s))时发生异常;捕捉块不能捕捉异常,因为它捕捉""执行异常"具体而言,因此函数本身应该自动抛出异常,因为它的签名已抛出语句我写的捕捉块是用于处理逻辑处理的,如果我在try捕捉之外写同样的语句,它不会给出任何错误。我想了解这里的行为。请好心帮忙