即使我的构造函数已经实例化了对象数组,我的程序也会给我空指针。为什么我得到例外? 这是我的代码:当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;
}
}
答案 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
的名称相似且不同的字段。