对象数组导致的空指针异常

构造方法的主要作用是创建对象,并对类进行初始化。

一般情况下:

new一个对象的时候要用到构造函数,若调用无参构造方法,则会使对象中的成员变量具有默认值,例如:int类型的默认值为0、引用数据类型的默认值为null;

当我们new一个对象数组时,需要为每一个元素实例化。

//Student 成员变量名:(String类型)name、(Book类型)book;
//new 一个对象数组,并未使用构造方法,若直接用set或get方法,会引发空指针异常
Student[] s = new Student[3];
s[0].setName("张三");//空指针异常
s[0].getName();//空指针异常

//此处用了空参构造,会对Student对象的成员变量进行初始化
s[0] =new Student();//对s[0]实例化
s[0].setName("张三");//不会报错
s[0].getName();//不会报错

//值得注意的是,若Student对象的成员变量有一个为对象(Book)
//Book 成员变量名:id、name、price
Book book1=new Book();
//如果访问变量book则会输出null
System.out.println(s[0].getBook());//输出 null

//若再访问book里面的成员变量,报错!因为book是null值,而空值不能访问
System.out.println(s[0].getBook().getId());//空指针异常

s[0].setBook(book1);
System.out.println(s[0].getBook().getId());//不会报错

 

发生NullPointerException的情况:

1.调用 null 对象的实例方法时。
2.访问或修改 null 对象的字段时。
3.如果一个数组为null,试图用属性length获得其长度时。
4.如果一个数组为null,试图访问或修改其中某个元素时。
5.在需要抛出一个异常对象,而该对象为 null 时。

解决方案:

为每一个元素实例化!

可以用for循环为对象数组中每一个元素实例化

看情况抛出异常

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中的异常处理机制的简单原理和应用。 异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。 Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。 java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。 提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值