java创建自定义类的数组
错题笔记
学习动态规划做例题hdu 2602遇到的问题:创建自定义类后,新建一个自定义类的数组,向数组赋值时报如下错误:
java.lang.NullPointerException: Cannot assign field "val" because "bone[i]" is null
通过搜索报错信息发现也有同学出现了类似问题,根据大家的经验我在代码中加入了标注行
import java.util.Scanner;
public class ddd20 {
class BONE{
int val;//体积
int vol;//价值
BONE(int val,int vol){
this.val = val;
this.vol = vol;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
BONE bone[] = new BONE[N];
for(int i=0;i<N;i++){
bone[i] = new BONE();//根据网上资料添加
bone[i].val = sc.nextInt();
}
for(int i=0;i<N;i++){
bone[i].vol = sc.nextInt();
}
for(int i=0;i<N;i++){
System.out.println("体积:"+bone[i].val+"重量:"+bone[i].vol);
}
}
}
结果仍然报错
cannot be referenced from a static context
于是尝试其他方法,将自定义类放置于主结构外,并给初始化后的数组元素赋予初值,使得指针指向该位置,改后代码如下:
import java.util.Scanner;
public class ddd20 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
BONE bone[] = new BONE[N];
for(int i=0;i<N;i++){
bone[i] = new BONE(0,0);
bone[i].val = sc.nextInt();
}
for(int i=0;i<N;i++){
bone[i].vol = sc.nextInt();
}
for(int i=0;i<N;i++){
System.out.println("体积:"+bone[i].val+"重量:"+bone[i].vol);
}
}
}
class BONE{
int val;//体积
int vol;//价值
BONE(int val,int vol){
this.val = val;
this.vol = vol;
}
}
运行无错。
总结:在java中,数组存放的是这个类型的对象,万物皆对象。Java语言本身是不提供在自定义类数组声明时候自动创建新对象的方式的。