即使所有类型都正确,我仍然收到 InputMismatchException,ido 应该怎么做?

I keep getting an InputMismatchException even though all types are correct , what should ido?

提问人:Saad Belkhou 提问时间:12/4/2020 更新时间:12/4/2020 访问量:51

问:

import java.util.Scanner;

public class Messdaten {
    public static double temperaturInDurchschnitt(Scanner sc){
        int year= 0, month= 0 , day= 0;
        String discription = "";
        double value= 0.0;
        double warmest= -273.15;
        int i = 0;
        double sum = 0.0;
        while (sc.hasNext()) {
            year= sc.nextInt();
            month= sc.nextInt();
            day= sc.nextInt();
            discription = sc.nextLine();
            if (discription.equals("Temperatur")){
                value= sc.nextDouble();
                sum = sum + value;
                if (value>= warmest){
                    warmest = value;
                }

            }
            value = sc.nextDouble();
        } sc.close();
        System.out.println("highest Temperatur " + "(" + warmest+ ")" + "at" + day+ month+ year);
        return sum/i;
    }


    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        temperaturInDurchschnitt(sc);
    }

}

我试图仅从给定的文本中收集 temperatur 的值:

2018年10月16日 德国空军 1014.7

2018年10:17 Niederschlag 1.3

2018 10:15 温度 18.2

2018年10月16日 尼德施拉格 0.0

并返回当天的最高温度。

2018:10:17 温度:16.8

java.util.scanner 输入MismatchException

评论

0赞 CryptoFool 12/4/2020
请在您的问题中提供完整的错误消息,包括堆栈跟踪。
0赞 kasptom 12/4/2020
value = sc.nextDouble();从输入的第二行读取...因此,尝试读取 int 以防止导致异常2018day= sc.nextInt();Niederschlag

答:

0赞 CryptoFool 12/4/2020 #1

您通过 ur 读取每一行的逻辑不正确。只看代码的这一部分,它应该读取一行:Scanner

year= sc.nextInt();
month= sc.nextInt();
day= sc.nextInt();
discription = sc.nextLine();
if (discription.equals("Temperatur")){
    value= sc.nextDouble();
    sum = sum + value;
    if (value>= warmest){
        warmest = value;
    }
}
value = sc.nextDouble();

当您调用 时,您现在已经读取了该行的整个其余部分并将其分配给 。所以接下来的检查永远不会是 ,因为即使它应该成功,也会是 。但我认为你在到达那里之前就偏离了轨道。当您调用时,您不会在一行末尾获得值,因为您已经读取了整行。相反,您将从下一行获取年份值。现在,您与传入的数据不同步。我希望当你调用读取值时会出现错误,并且你得到的是描述值而不是日期值,当然,它不能解析为整数。sc.nextLine()discriptiontruediscriptionTemperatur 16.8sc.nextDouble()nextInt()day

0赞 kasptom 12/4/2020 #2
        // ...
        double sum = 0.0;
        String line;
        while (!(line = sc.nextLine()).isBlank()) { // 1
            String[] splitLine = line.trim().split(" "); // 2
            discription = splitLine[3];
            if (discription.equals("Temperatur")) {
                value = Double.parseDouble(splitLine[4]);
                sum = sum + value;
                if (value >= warmest) {
                    warmest = value;
                    year = Integer.parseInt(splitLine[0]);  //3
                    month = Integer.parseInt(splitLine[1]);
                    day = Integer.parseInt(splitLine[2]);
                }
            }
        }
        sc.close();
        // ...

言论:

  • //1您需要知道何时停止读取输入 - 例如,您可以检查下一行是否为空
  • //2为了避免评论中提到的问题,我会阅读整行并将每个空格分隔的部分解析为预期的类型
  • //3似乎您想存储最热的一天的 ,因此只有在找到更高的温度时才应该更新它。yearmonthday