如何从非静态方法访问作为我的实例变量的对象数组?

时间:2016-09-23 05:29:11

标签: java arrays object

即使我的构造函数已经实例化了对象数组,我的程序也会给我空指针。为什么我得到例外? 这是我的代码:当main方法运行比较行时,它给我一个空指针异常。我不能这样访问我的对象吗?

class MPLTest{
int n;
MPL []std;
MPLTest(){
    System.out.println("Enter number of Standards: ");
    Scanner in = new Scanner(System.in);
    n=in.nextInt();
    MPL []std = new MPL[n];
    for(int i=0;i<n;i++){
        System.out.println("Enter the number of students for standard "+(i+1));
        std[i]=new MPL(i+1,in.nextInt());
    }

}
public static void main(String [] args){

    MPLTest test = new MPLTest();
    System.out.println("The standard scoring the highest total marks is "+test.findBestClass());

}
int findBestClass(){
    int best=0;
    for(int i=1;i<n;i++){
        if(std[i].findTotal()>std[best].findTotal()) //the exception is here
            best=i;
    }
    return best+1;
}

}

2 个答案:

答案 0 :(得分:0)

您得到NullPointerException,因为全局实例数组未在构造函数中初始化。您已在类中声明std[],但在构造函数中,您已声明 new 数组,这是一个类型为MPL本地数组。要初始化实例数组,请替换

MPL[] std = new MPL[n]; //creates a local variable

std = new MPL[n]; //points to the global variable

这与使用实例变量int n类似。在构造函数中,您

int n = in.nextInt();

但是

n = in.nextInt();

因为n已经声明了。以相同的方式初始化数组。

答案 1 :(得分:-1)

MPL []std;
    MPLTest(){
        System.out.println("Enter number of Standards: ");
        Scanner in = new Scanner(System.in);
        n=in.nextInt();
→       MPL []std = new MPL[n];

这称为shadowing。块中的std是一个局部变量,它会隐藏一个名为std的名称相似且不同的字段。