为什么在调用子类方法时会出现空指针异常?

时间:2016-03-30 16:42:09

标签: java

我正在尝试制作一个打印学生成绩列表的程序。当调用子类方法msort时,我收到错误。程序根据标记进行排序,如果总标记相同,则调用另一个检查各个标记的函数。

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

1 个答案:

答案 0 :(得分:0)

当您创建Student的新实例时,您正在处理Stud_new的新实例。您无法保留在一个实例中初始化的变量的状态。

要解决这个问题,一个反映super的简单构造函数就足够了。

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

然后,您将在父Student类中使用类似参数调用它。

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

请记住:继承保留了结构的完整性,而不是数据。如果你想要父母在孩子身上的数据,你必须提供它。

请注意,这不是对排序正确性的评论。这仅用于解决NPE问题。