使用nextFloat()的线程“main”java.util.InputMismatchException中的异常

时间:2018-01-13 21:02:53

标签: java

所以我正在编写一个小程序来做一个学生最好成绩的平均值,当我运行它时,我得到这个错误在线程“main”中的异常java.util.InputMismatchException。

我看到一个帖子,据说使用了nextLine,然后使用parseInt(在这种情况下是parseFloat),但是我不允许在这里使用它,所以我正在寻找另外一个我能做什么的意见

代码:

import java.util.Scanner;

公共班级G2a {

static float average(float[] vals) { //Returns the average of an array;
    float avg = 0F;
    for (int i = 0; i < vals.length; i++)
        avg += vals[i];
    return avg /= vals.length;
}

static int indexOfMin(float[] vals) { // Returns the index of the minimum;
    int idx = -1;
    for (int i = 0; i < vals.length ; i++) {
        float v = vals[i];
        if(v>=0 && (idx==-1 || v<vals[idx])) idx=i;
    }
    return idx;
}

static float[] removeMins(int n, float[] vals) { //Removes n minimums of the array and returns a new array without them;
    while (n > 0) {
        int a = indexOfMin(vals);
        vals[a] = -1;
        --n;
    }
    float[] res = new float[vals.length - n];
    int b = 0;
    for (int i = 0; i < vals.length; i++)
        if (vals[i] != -1) {
            res[b] = vals[i];
            ++b;
        }
    return res;
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Number of Grades ? ");
    float[] vals= new float[in.nextInt()];
    for (int i = 0; i < vals.length ; i++) {
        System.out.println("Grade "+ (i+1) +" ? ");
        vals[i]=in.nextFloat(); //Line of the Error;
    }
    System.out.println("Number of Grades to the Average ? ");
    int n = in.nextInt();
    float [] best = removeMins(n,vals);
    System.out.print("Best " +n+ " Grades: ");
    for (int i = 0; i < best.length ; i++)
        System.out.print(best[i]);
    System.out.println("");
    System.out.println("Average of the " +n+ " Best Grades = "+average(best));
}

}

修改

我正在使用Intellij

输入和完整错误消息:

等级数?

5

1年级?

7.3

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:860)
at java.base/java.util.Scanner.next(Scanner.java:1497)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2399)
at G2a.main(G2a.java:42)

使用退出代码1完成处理

3 个答案:

答案 0 :(得分:0)

我猜你在输入中使用这样的东西:

1.5

请改用以下内容:

1,5

键入浮点数。如果您使用点,则解决方案可能是Scanner中使用的区域设置。尝试更改main()方法中的第一行:

Scanner in = new Scanner(System.in);

为:

Scanner in = new Scanner(System.in).useLocale(Locale.US);

此行将精确显示您在键入十进制数时要使用的符号。看,它是如何改变读取输入的方式(现在点是可以的,当逗号不是时):

Number of Grades ? 
3
Grade 1 ? 
1.3
Grade 2 ? 
1,4
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Unknown Source)
    at java.base/java.util.Scanner.next(Unknown Source)
    at java.base/java.util.Scanner.nextFloat(Unknown Source)
    at G2a.main(G2a.java:44)

答案 1 :(得分:0)

我认为您的错误是因为您提供了

之类的输入
2.6
3.6

等。

它是一个浮点数,输入应该是逗号而不是点的。所以

2,6
3,6
etc..

我测试了它,输入工作正常:)

//编辑
正如Dukeling提到重复一样,如果你想要它是逗号,你需要使用

Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

此处有更多信息 - &gt; Scanner double value - InputMismatchException

答案 2 :(得分:0)

似乎在我测试您的代码时,我输入了76100中的百分比,没有任何错误。您的问题是方法nextInt只读取一个整数,而不是数组。 Scanner正在将逗号分析为字符串的一部分,因此请输入成绩的百分比,您应该没问题。