Java中的空指针异常
Java中的空指针异常
一、什么是空指针异常?
1.1 异常的分类
NullPointerException是RuntimeException的一个子类,这是运行时异常,在编译时期不会触发。
1.2 空指针异常引入
Java是没有指针的,所以我们常说"Java 指针"就是指"Java 的引用"。空指针就是空引用,Java空指针异常就是引用本身为空,但却调用了方法,这个时候就会出现空指针异常。
成员变量和方法是属于对象的(除去静态的),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法。
而对于空指针来说,它是不指向任何对象的,也就是没有所谓的成员变量和方法,这个时候去调用某些属性和方法时,就一定会出现空指针异常。
1.3 空指针异常说明
二、Java中的null
null是Java中一个很重要的概念,null 设计的初衷是为了表示一些缺失的东西,比如缺失的用户、资源或一些其他东西。
首先,null是关键字,像public、static、final。它是大小写敏感的,你不能将 null 写成 Null 或 NULL,编译器将不能识别它们然后报错。null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将 false 作为自己的默认值,Java中的任何引用变量都将 nul l作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。
null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将 null 转化成任何类型。
null可以赋值给引用变量,但不能将null赋给基本类型变量。例如int、double、float、boolean。编译器将会报错。
当直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的。
任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。
三、空指针产生的常见情况及避免办法
3.1 字符串常量未初始化,比较时导致空指针异常、
出现空指针
避免空指针
3.2 接口类型的对象没有使用具体的类进行初始化导致空指针异常
避免空指针
3.3 参数类型为包装类型,使用时自动拆箱导致空指针异常
四、总结和技巧
在遇到空指针错误时,要重点关注报错发生的所在行,通过空指针异常产生的两条主要原因(变量未初始化和对象为空)诊断具体的错误,主要注意以下几点:
检查使用之前是否进行了初始化;
尽量避免在函数中返回 null 值,如果必须要返回 null 值,一定要给出详细的注释信息;
外部传值时,一定要及时的进行判空处理(除非有明确的说明可以为 null );
使用 equals() 方法时,要遵循 “常量在前变量在后"的原则;
使用 valueOf() 替换toString();
通过返回空的 Collection 或 Array 来替代 null 值;
使用注解 @NotNull、@Nullable;
定义合理的默认值,遵守约定(比如设置默认值,设置是否允许为空,从而形成合理的约定);
从数据库取数据,可以约束哪些字段不能为空。
Java中的8种数据类型,变量的值可以有其默认值,假如没有对其正常赋值,Java虚拟机是不能正确编译通过的,所以使用基本数据类型一般是不会引起空指针异常的。也就是说,在实际开发中大多数的空指针异常主要与对象的操作相关。