概述
在编程语言中,空指针(Null Pointer)是一个已宣告但并未指向一个有效对象的指针,许多程序利用空指针来表示某些特定条件,例如未知长度数组的结尾或某些无法运行的操作。在可选择类型(optional type)的编程语言中,空指针通常可以跟可为Null的类型(Nullable types)和空值(Nothing value)进行比较。
空指针与未初始化的指针(uninitialized pointer)不同,空指针保证不会和有值的指针相等,而未初始化的指针则是要看所使用的编程语言或编译器而定,在部分编程语言环境下,未初始化的指针无法保证不与有值的指针相等,他可能因为存有存储器残值而指向了某个有效对象。
空指针异常
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
- 调用 null 对象的实例方法。
- 访问或修改 null 对象的字段。
- 将 null 作为一个数组,获得其长度。
- 将 null 作为一个数组,访问或修改其时间片。
- 将 null 作为 Throwable 值抛出。
空指针异常原因
1、当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在;
2、当访问或修改一个对象不存在的字段时会产生异常obj.method() // method方法不存在;
3、字符串变量未初始化;
4、接口类型的对象没有用具体的类初始化;
当一个对象的值为空时,你没有判断为空的情况。你可以试着把下面的代码前加一行代码:
改成:
空指针的解决办法:
重点关注报错发生的所在行,通过空指针异常产生的两条主要原因诊断具体的错误。同时为了避免空指针的发生,最好在做判断处理时将“null”或者空值放于设定的值之前。
异常处理的语法规则
1、try 语句不能单独存在,可以和catch、finally 组成
try...catch...finally、try...catch、try...finally 三种结构,catch 语句可以有一个或多个,finally 语句最多一个,try、catch、finally 这三个关键字均不能单独使用。
2、try、catch、finally 三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
3、多个catch 块时候,Java 虚拟机会匹配其中一个异常类或其子类,就执行这个catch 块,而不会再执行别的catch 块。
4、throw 语句后不允许有紧跟其他语句,因为这些没有机会执行。
5、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。
Java空指针异常解决方法
Throwable是所有错误或异常的超类,只有当对象是这个类的实例时才能通过Java虚拟机或者Java throw语句抛出。
当Java运行环境发出异常时,会寻找处理该异常的catch块,找到对应的catch块之后,将异常交给catch块捕获。
throwable的子类是exception和error,exception等;
例如:
第二行报空指针异常
那么books对象为null,向上查找第一行中Dao.getData();
那么进一步查看Dao对象是否为空,若不为空,则继续向上查找,找出为null的对象
改进:
1.增加条件判断
2.捕获异常