出现 InputMismatchException,我该如何解决?

There's an InputMismatchException, how do i fix it?

题目是输出每个职级的总工资和平均工资, 这是我的代码:

     URL url=new URL("http://liveexample.pearsoncmg.com/data/Salary.txt");
        Scanner input=new Scanner(url.openStream());
        String[]FirstName=new String[1000];
        String[]LastName=new String[1000];
        String[]rank=new String[1000];
        int[]salary=new int[1000];
        
        int i=0;
        int count=0;
        double sum=0;
        while(input.hasNext()) {
            FirstName[i]=input.nextLine();
            LastName[i]=input.nextLine();
            rank[i]=input.nextLine();
            salary[i]=input.nextInt();
            if(rank[i]=="assistant") {
                count++;
                sum+=salary[i];
                System.out.print("Total salary of assistant professors:"+sum+" average: "+sum/count);
            }
            else if(rank[i]=="associate") {
                count++;
                sum+=salary[i];
                System.out.print("Total salary of associate professors:"+sum+" average: "+sum/count);
            }
            else if(rank[i]=="full") {
                count++;
                sum+=salary[i];
                System.out.print("Total salary of full professors:"+sum+" average: "+sum/count);
            }
            else if(rank[i]=="faculty") {
                count++;
                sum+=salary[i];
                System.out.print("Total salary of faculty professors:"+sum+" average: "+sum/count);
            }
            input.close();
        }

但是输出是 InputMismatchException,我检查了我的代码很多次,我找不到错误

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 HW11_09156136.HW11_09156136_01.main(HW11_09156136_01.java:24)

input.nextLine() 不检索流中的下一个单词,它检索下一行。根据您在程序中提供的 url,您的代码正在将 FirstName1 LastName1 assistant 79174.73 分配给 FirstName[i]FirstName2 LastName2 associate 70817.75 分配给 LastName[i],等等,直到到达该行FirstName4 LastName4 full 116992.43。它从那里尝试将 FirstName4 解析为 int,这当然会失败。您需要您的程序使用 next(),它只获取下一个 space 之前的文本,而不是换行符,所以

            FirstName[i]=input.nextLine();
            LastName[i]=input.nextLine();
            rank[i]=input.nextLine();
            salary[i]=input.nextInt();

可以用

之类的东西代替
            FirstName[i]=input.next();
            LastName[i]=input.next();
            rank[i]=input.next();
            salary[i]=input.nextInt();
            input.nextLine();

(注意最后需要多一个input.nextLine(),推理见here)

FirstName7 LastName7 assistant 70071.81

您的输入行包含一位教授的所有信息,因此您必须一次阅读一位教授的一行。你可以这样做。 此外,您必须将不同等级的数据存储在不同的变量集中,都用于 counting and sum.

    URL url=new URL("http://liveexample.pearsoncmg.com/data/Salary.txt");
    Scanner input=new Scanner(url.openStream());
    String[]FirstName=new String[1000];
    String[]LastName=new String[1000];
    String[]rank=new String[1000];
    int[]salary=new int[1000];
    
    int i=0;//indexing
    
    //sums of total number of professors according to there rank
    int count_assistant=0;
    int count_associate=0;
    int count_full=0;
    int count_faculty=0;
    
    //sum up of salary of professors according to there rank
    double sum_assistant=0;
    double sum_associate=0;
    double sum_full=0;
    double sum_faculty=0;
    
    String data[] = null;
    while(input.hasNextLine()) {
        data = input.nextLine().split(" ");
        FirstName[i] = data[0];
        LastName[i] = data[1];
        rank[i] = data[2];
        salary[i] = Double.parseDouble(data[3]);
        if(rank[i]=="assistant") {
            count_assistant++;
            sum_assistant+=salary[i];
        }
        else if(rank[i]=="associate") {
            count_associate++;
            sum_associate+=salary[i];
        }
        else if(rank[i]=="full") {
            count_full++;
            sum_full+=salary[i];
        }
        else if(rank[i]=="faculty") {
            count_faculty++;
            sum_faculty+=salary[i];
        }
        i++;//increment for next professor
    }
    input.close();
    System.out.print("Total salary of assistant professors:"+sum_assistant+" average: "+sum_assistant/count_assistant);
    System.out.print("Total salary of associate professors:"+sum_associate+" average: "+sum_associate/count_associate);
    System.out.print("Total salary of full professors:"+sum_full+" average: "+sum_full/count_full);
    System.out.print("Total salary of faculty professors:"+sum_faculty+" average: "+sum_faculty/count_faculty);
}