我不断得到一个inputmismatchexception,即使所有类型都是正确的,我应该怎么做?

vs91vp4v  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(370)
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);
    }

}

我试图仅从给定的文本中收集温度值:
2018 10 16德国航空公司1014.7
2018年10月17日niederschlag 1.3
2018 10 15温度18.2
2018年10月16日niederschlag 0.0
返回当天的最高温度。
2018 10 17温度16.8

xa9qqrwz

xa9qqrwz1#

你的逻辑是通过你的 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() ,您现在已经阅读了该行的其余部分并将其分配给 discription . 所以接下来的支票永远不会兑现 true ,因为即使在应该成功的地方, discriptionTemperatur 16.8 . 但我认为你在到达之前就偏离了轨道。当你打电话的时候 sc.nextDouble() ,您将无法获得行末尾的值,因为您已经阅读了整行。相反,您将从下一行获得年份值。现在你和你的输入数据不同步了。我希望你打电话时会出错 nextInt() 阅读 day 值,得到的是description值而不是day值,当然,day值不能解析为整数。

tktrz96b

tktrz96b2#

// ...
        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 好像你想把 year , month 以及 day 最热的一天,所以只有当你发现更高的温度时才应该更新。

相关问题