美文网首页
8.空指针异常

8.空指针异常

作者: 木有鱼丸啦 | 来源:发表于2017-11-01 18:43 被阅读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;

    }

    }

    相关文章

      网友评论

          本文标题:8.空指针异常

          本文链接:https://www.haomeiwen.com/subject/gewgpxtx.html