java空指针异常原因
作者:互联网
1. 使用类直接调用非静态方法,会抛空指针异常。
2. 获取从别的对象传过来的对象为空
3. 数据库查询方面的空指针异常,数据库中储存的值为null或不存在
4. 结果集 rs 是空的啊或者未初始化就被调用了
Java虽然会在编译过程中,去验证变量和赋值的类型,但是由于空值(NULL)代表了所有未初始化的对象,因此空值可以被分配为任何类型(如下图所示),且Java不会报错。
public class Demo9 { public static void myprint(){ System.out.println("zzt"); } public static void main(String[] args) { try { ((Demo9)null).myprint();//类可以直接调用静态方法,此时输出zzt,如果调用非静态就抛出空指针异常,指向了空引用 } catch (Exception e) { System.out.println("nullpointer"); e.printStackTrace(); } } }
如何从根源避免空指针
- 使用之前一定要初始化,或检查是否初始化
- 尽量避免在函数中返回 NULL, 或给出详细的注释
- 外部传值,除非有明细的说明,否则,一定要判断是否为 NULL
空指针出现的几种情况
第一种情况:调用了空对象的实例方法
代码示例
第二种情况:访问了空对象的属性
第三种情况:当数组是一个空对象时,取它的长度
第四种情况:null 当做 Throwable 的值
第五种情况:方法的返回值是 null, 调用方直接去使用
对方法返回的值需要进行校验
赋值时自动拆箱出现空指针
- 变量赋值自动拆箱出现的空指针
Long 自动拆箱为 long 实质是调用了 longValue 方法,由于以上的 Long 类型变量值为 null,自动拆箱就会报 NPE
- 方法传参时自动拆箱引发的空指针
原因同上,包装类型自动拆箱都需要注意是否为 null
- 用于大小比较的场景
通过字节码可以知晓其中缘由
现在就一目了然了,以上自动拆箱报 NPE,原因在于装箱的值为 null,调用 null 的任何 方法都会报错
规避指南:
- 基本数据类型优于包装器类型,优先考虑使用基本类型
- 对于不确定的包装器类型,一定要校验是否为 NULL
基本数据类型比包装器类型更加节省时间与空间
https://zhuanlan.zhihu.com/p/354864202
标签:拆箱,调用,java,NULL,类型,null,异常,指针 来源: https://www.cnblogs.com/xiaofeilin/p/16370806.html