对象数组不能直接使用,因为会报空指针异常
publicstaticvoidmain(String[] args) {
Customercustomer=newCustomer();
Scannerscanner=newScanner(System.in);
CustomerBiz biz=newCustomerBiz();
for(inti = 0; i < biz.cArray.length; i++) {
biz.cArray[i]=newCustomer();
//必须先初始化
System.out.println("请输入姓名:");
biz.cArray[i].name=scanner.next();
System.out.println("请输入年龄:");
biz.cArray[i].age=scanner.nextInt();
biz.addCustomer(biz.cArray[i]);
}
biz.show();
}
}
如果直接使用会报错,本身来说是并没有问题的,
但是因为stu是一个Student类的数组,里面的元素都是对象,
而此时所有的元素都没有赋值,默认的初始值为null,
使用null.成员变量或者null.成员方法 都会提示NullPointerException的错误
·直接使用会报错的例子
·解决方法
o方法一
o方法二
o方法三(变种)
o方法四(for循环直接用stu[i] = new Stu初始化)
直接使用会报错的例子
publicclass ObjectArray{
publicstaticvoid main(String[] args)
{
Student[] stu =newStudent[10];
//如下这种写法会报错, 本身来说是并没有问题的,
//但是因为stu是一个Student类的数组,里面的元素都是对象,
//而此时所有的元素都没有赋值,默认的初始值为null,
//使用null.成员变量或者null.成员方法
//都会提示NullPointerException的错误
stu[0].name ="张三";//-->会报NullPointerException错误
/*
上面的程序已经出错,后面的就都省略了
*/
}
}
class Student{
publicStringname;
publicint age;
publicStringtel;
publicStringtoString()
{
return"姓名:"+this.name+", 年龄"+this.age+",电话"+this.tel;
}
}
解决方法
方法1
使用构造方法进行赋值
publicclass ObjectArray{
publicstaticvoid main(String[] args)
{
//直接用构造方法给对象赋值
Student stu1 =newStudent("张三",20,"18880472012");
Student stu2 =newStudent("李四",22,"13666150682");
Student stu3 =newStudent("王五",18,"13433430766");
//将上面构造方法new好的对象,分别赋给数组
Student[] stu =newStudent[3];
stu[0] = stu1;
stu[1] = stu2;
stu[2] = stu3;
for(int i =0; i
{
System.out.println(stu[i]);//-->因为已经重写过toString方法,所以可以直接打印数组
}
}
}
class Student{
//将成员变量顺便封装一下
privateStringname;
privateint age;
privateStringtel;
//写一个构造方法,以便在主函数中直接调用赋值
publicStudent(Stringname;int age;Stringtel)
{
this.name = name;
this.age = age;
this.tel = tel;
}
publicStringtoString()
{
return"姓名:"+this.name+", 年龄"+this.age+",电话"+this.tel;
}
}
方法2
对各成员变量分别赋值
publicclass ObjectArray{
publicstaticvoid main(String[] args)
{
//new 一个stu1, 再用对象.成员变量的方法将各属性赋值
Student stu1 =newStudent();
stu1.name ="张三";
stu1.age =20;
stu1.tel ="18880472012";
//new 一个stu2, 再用对象.成员变量的方法将各属性赋值
Student stu2 =newStudent();
stu2.name ="李四";
stu2.age =22;
stu2.tel ="13666150682";
//new 一个stu3, 再用对象.成员变量的方法将各属性赋值
Student stu3 =newStudent();
stu3.name ="王五";
stu3.age =18;
stu3.tel ="13433430766";
//new 一个Student数组, 分别将stu1,stu2,stu3的值赋给对应的数组元素
Student[] stu =newStudent[3];
stu[0] = stu1;
stu[1] = stu2;
stu[2] = stu3;
}
}
class Student{
publicStringname;
publicint age;
publicStringtel;
publicStringtoString()
{
return"姓名:"+this.name+", 年龄"+this.age+",电话"+this.tel;
}
}
方法3(变种)
使用for循环对各元素进行赋值
import java.util.Scanner;publicclassObjectArray
{
privatestaticScannerin;
public static void main(String[] args)
{
in=newScanner(System.in);
Student[] stu =newStudent[3];
for(inti =0;i
{
//临时的stuI一定要在for里面定义,否则stuI赋给stu[i]之后,
//因为指向相同,stu[i]会被不断的复写,最后会出现所有的stu的值全部一样
Student stuI =newStudent();
//给成员变量初始化
System.out.println("请输入第"+(i+1)+"个学生的信息:");
System.out.println("姓名:");
stuI.name =in.next();
System.out.println("年龄:");
stuI.age =in.nextInt();
System.out.println("电话:");
stuI.tel =in.next();
//将stuI赋给stu[i]
stu[i] = stuI;
}
//打印
for(inti =0;i
{
System.out.println(stu[i]);
}
}
}
classStudent
{
publicString name;
publicintage;
publicString tel;
public String toString()
{
return"姓名:"+this.name+", 年龄"+this.age+",电话"+this.tel;
}
}
方法4
直接给stu[i]赋new Student()对象, 来规避NullPointer Exception错误
publicclasstest1111
{
public static void main(String [] args)
{
Stu[] stu =newStu[3];
for(inti =0; i
{
//直接用stu[i] = new Stu()来将null变为new Stu();
stu[i] =newStu();
stu[i].setName("张三");
stu[i].setAge(15);
}
for(inti =0;i
{
System.out.println(stu[i]);
}
}
}
classStu
{
privateString name;
privateintage;
public String getName()
{
returnname;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
returnage;
}
public void setAge(int age)
{
this.age = age;
}
public String toString()
{
returnthis.name+" : "+this.age;
}
}