javaurlioexceptionread-data

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


The question is to output the total salary and average salary of each rank, this is my code:

     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();
        }

however the output is InputMismatchException,and i checked my code many times, i can't find the error

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)

Solution

  • input.nextLine() doesn't retrieve the next word in the stream, it retrieves the next line. Based on the url you provided in the program, your code is assigning FirstName1 LastName1 assistant 79174.73 to FirstName[i], FirstName2 LastName2 associate 70817.75 to LastName[i], etc. until it gets to the line FirstName4 LastName4 full 116992.43. From there it tries to parse FirstName4 as an int, which of course fails. You need your program to use next(), which only gets text up to the next space, not newline, so

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

    could be replaced with something like

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

    (Note that you need an extra input.nextLine() at the end, reasoning seen here)