-1

I am trying to make a program which prints the merit list of the students. When a call to subclass method msort is made, I am getting the error. The program sorts according to the marks and if total marks are same then a call is made to another function which checks the individual marks.

import java.util.*;


class Student {
    int[] ph, ch, ma;
    int[] total;
    int[] total_sort;

    Student() {
    }

    // length of array and marks are received via constructor.
    Student(int x, int[] p, int[] c, int[] m) {

        // an array of p,c,m along with 2 arrays of total marks is made.
        total = new int[x];
        total_sort = new int[x];
        ph = new int[x];
        ch = new int[x];
        ma = new int[x];
        for (int i = 0; i < x; i++) {
            ph[i] = p[i];
            ch[i] = c[i];
            ma[i] = m[i];
            total[i] = (p[i] + c[i] + m[i]);
            total_sort[i] = total[i];
        }
    }

    // sorts the array accoring to the total marks
    void Sort() {

        // to use subclass method.
        Stud_new t = new Stud_new();

        for (int d = 0; d < total.length - 1; d++) {
            for (int f = 0; f < total.length - d - 1; f++) {
                if (total_sort[f] < total_sort[f + 1]) {
                    int temp = total_sort[f];
                    total_sort[f] = total_sort[f + 1];
                    total_sort[f + 1] = temp;

                }
                // checks for higher maths marks.
                else if (total_sort[f] == total_sort[f + 1]) {
                    int m = t.mSort(f);
                    int temp1 = total_sort[f];
                    total_sort[f] = total_sort[m];
                    total_sort[f + 1] = temp1;
                }
            }
        }
    }

    /* returns the index from original total array so as to identify the students' name.
     * marks from sorted array are compared with original array to find the index of marks in originial array .
     * this index is used to find the students' name.
     */
    int GetList(int a) {
        for (int j = 0; j < total.length; j++) {
            if (total[j] == a) {
                return j;
            }
        }
        return -1;
    }
}

class Stud_new extends Student {

    int cSort(int ci) {
        if (ch[ci] > ch[ci + 1]) {
            return ci;
        } else if (ch[ci] < ch[ci + 1]) {
            return (ci + 1);
        }

        //else if(ph[pi] == ph[pi + 1])
        //csort(pi);
        return -1;
    }

    int pSort(int pi) {

        if (ph[pi] > ph[pi + 1]) {
            return pi;
        } else if (ph[pi] < ph[pi + 1]) {
            return (pi + 1);
        } else if (ph[pi] == ph[pi + 1]) {
            return (cSort(pi));
        }

        return -1;
    }

    int mSort(int mi) {

        if (ma[mi] > ma[mi + 1]) {
            return mi;
        } else if (ma[mi] < ma[mi + 1]) {
            return (mi + 1);
        }

        // checks higher phy marks
        else if (ma[mi] == ma[mi + 1]) {
            return (pSort(mi));
        }

        return -1;
    }
}

class Mlist {

    public static void main(String args[]) {

        // initializes the names and marks.
        String[] name = {"foo", "bar", "baz"};
        int[] phy = {100, 112, 100};
        int[] chem = {100, 120, 80};
        int[] maths = {40, 68, 60};

        Student stud = new Student(name.length, phy, chem, maths);

        stud.Sort();

        System.out.println("Name\tPhysics\tChemi\tMaths\tTotal");

        // prints the merit list
        for (int i = 0; i < name.length; i++) {

            // index of name is received by a function call

            /* STUD.TOTAL_SORT[i] IS STUDENTS' MARKS IN SORTED MANNER.
             * THIS IS PASSED AS AN ARGUMENT TO GETLIST METHOD WHICH USES LINEAR SEARCH
             * TO FIND THE INDEX IN THE ARRAY OF NAMES FOR THE STUDENT WHOSE MARKS IS PASSES
             * THE FUNCTION RETURNS INT WHICH IS THE INDEX FOR NAME[] ARRAY. and others all well.
             * HERE STUD.TOTAL_SORT[I] IS AN ARGUMENT TO THE FUNCTION STUD.GETLIST() WHICH RETURNS AN INT            
             */

            System.out.println(name[stud.GetList(stud.total_sort[i])] + "\t" + phy[stud.GetList(stud.total_sort[i])] + "\t" + chem[stud.GetList(stud.total_sort[i])] + "\t" + maths[stud.GetList(stud.total_sort[i])] + "\t" + stud.total_sort[i]);
        }
    }
}
Makoto
  • 104,088
  • 27
  • 192
  • 230
shiwchiz
  • 43
  • 7

1 Answers1

0

You're dealing with a new instance of a Student when you create a new instance of Stud_new. You don't get to preserve the state of the variables that you initialize in one instance.

To solve this, a simple constructor that mirrors super would suffice.

public Stud_new(final int x, final int[] p, final int[] c, final int[] m) {
    super(x, p, c, m);
}

You would then invoke it with similar parameters in the parent Student class.

Stud_new t = new Stud_new(total.length, ph, ch, ma);

Remember: inheritance preserves integrity of structure, not data. If you want the data the parent has in the child, you have to provide it.

Note that this is not a comment on the correctness of your sort. This is only intended to address the NPE.

Makoto
  • 104,088
  • 27
  • 192
  • 230
  • Now I am only using a `Student` class and still getting the same error but according to you i shouldn't be getting that error in this case. – shiwchiz Mar 30 '16 at 17:08
  • I never guaranteed any behavior outside of the context of what I described. I tested it locally and it works fine. You must be doing something other than what I've shown here. – Makoto Mar 30 '16 at 17:09