8.空指针异常

2017-11-01  本文已影响0人  木有鱼丸啦

对象数组不能直接使用,因为会报空指针异常

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;

}

}

上一篇下一篇

猜你喜欢

热点阅读