3

EDIT: I fixed the original Exception error thanks to Tim Biegeleisen by adding if(scan.hasNextInt()) in the lines that I put a comment on below. But the output file gives me zeroes instead of the expected results.

I know that my code is very amateur-ish, but please bear with me as I'm still just a beginner. Thank you very much in advance!

EDIT2: The text file that it takes input from is structured like this:

50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87
50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87
50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87
50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87
50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87
50 50 50 50 50 50
65 73 45 98 90 76
33 90 75 34 42 55
56 86 88 99 23 97
65 78 79 98 70 87

EDIT3: It seems like the problem is that it doesn't go beyond the if in the first place for some reason.

  • I added if(scan.hasNextInt()) to to it and it fixed the problem, but the output file has all values as zero for some reason. Total scores, average and number of students who passed, all zeroes. – beta4attack Oct 23 '16 at 12:04
  • May I recommend you learn to use a debugger? It would be far more efficient than asking on stackoverflow ... – meriton Oct 23 '16 at 12:36

2 Answers2

0

NoSuchElementException is thrown when the Scanner does not have (in this case) anymore int to read.

I don't know the structure of your .txt file so it would be great if you could add it to your question.

Probably the solution will be to reset the offset of the scanner by doing the following:

scan.close();
scan = new Scanner(f);
for (int i = 0; i < 30; i++) {
    for (int j = 0; j < 6; j++) {
        subjects[i][j] = scan.nextInt();
    }
}

EDIT:

this code worked for me:

public static void main(String[] args) throws Exception {
    Scanner scan = new Scanner(new FileInputStream(new File("file.txt")));
    PrintWriter p = new PrintWriter("Class_report.txt");
    int x = 0, num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0;
    double avg1 = 0, avg2 = 0, avg3 = 0, avg4 = 0, avg5 = 0, avg6 = 0;
    int[] total = new int[30];
    int[] number = new int[6];
    int[][] subjects = new int[30][6];
    double[] average = new double[6];
    for (int i = 0; i < 30; i++) {
        for (int j = 0; j < 6; j++) {
            x = x + scan.nextInt();
        }
        total[i] = x;
        x = 0;
    }

    scan = new Scanner(new FileInputStream(new File("file.txt")));
    for (int i = 0; i < 30; i++) { //Exception starts appearing from this line.
        for (int j = 0; j < 6; j++) {
            subjects[i][j] = scan.nextInt();
        }
    }
    for (int i = 0; i < 30; i++) {
        avg1 = avg1 + (double) subjects[i][0];
        avg2 = avg2 + (double) subjects[i][1];
        avg3 = avg3 + (double) subjects[i][2];
        avg4 = avg4 + (double) subjects[i][3];
        avg5 = avg5 + (double) subjects[i][4];
        avg6 = avg6 + (double) subjects[i][5];
    }
    average[0] = avg1 / 30;
    average[1] = avg2 / 30;
    average[2] = avg3 / 30;
    average[3] = avg4 / 30;
    average[4] = avg5 / 30;
    average[5] = avg6 / 30;
    for (int i = 0; i < 30; i++) {
        if (subjects[i][0] >= 50) {
            num1++;
        }
        if (subjects[i][1] >= 50) {
            num2++;
        }
        if (subjects[i][2] >= 50) {
            num3++;
        }
        if (subjects[i][3] >= 50) {
            num4++;
        }
        if (subjects[i][4] >= 50) {
            num5++;
        }
        if (subjects[i][5] >= 50) {
            num6++;
        }
    }
    number[0] = num1;
    number[1] = num2;
    number[2] = num3;
    number[3] = num4;
    number[4] = num5;
    number[5] = num6;
    scan = new Scanner(new FileInputStream(new File("file.txt")));
    for (int i = 0; i < 30; i++) {
        for (int j = 0; j < 6; j++) {
            x = x + scan.nextInt();
        }
        total[i] = x;
        x = 0;
    }
    for (int i = 0; i < 30; i++) {
        p.println("Total score of student #" + (i + 1) + ": " + total[i]);
    }
    for (int i = 0; i < 6; i++) {
        p.println("Number of passing student in subject#" + (i + 1) + ": " + number[i]);
    }
    for (int i = 0; i < 6; i++) {
        p.println("Average score in subject#" + (i + 1) + ": " + average[i]);
    }
    p.close();
}

As i said, i just reset the pointer of the Scanner by creating a new instance of it. Just replace the "file.txt" with your filepath.

Jonas F.
  • 46
  • 3
0

Well, you read perfectly all numbers to your total. However, then you have nothing to read but still try. So you don't read so 0s are in all cells of number, subjects and average. Whats more, you overide total with 0s when you try to refill it.

So... you have to close and reopen the Class_scores.txt or first read it and store somewhere what in this case I recommend.

Once you read the whole File you won't be able to start reading from the beginning.

xenteros
  • 14,275
  • 12
  • 47
  • 81