编程语言
首页 > 编程语言> > java空指针异常原因

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();
        }
    }
}

 

   

如何从根源避免空指针

  1. 使用之前一定要初始化,或检查是否初始化
  2. 尽量避免在函数中返回 NULL, 或给出详细的注释
  3. 外部传值,除非有明细的说明,否则,一定要判断是否为 NULL

空指针出现的几种情况

第一种情况:调用了空对象的实例方法

代码示例

第二种情况:访问了空对象的属性

第三种情况:当数组是一个空对象时,取它的长度

第四种情况:null 当做 Throwable 的值

 

第五种情况:方法的返回值是 null, 调用方直接去使用

 

 

对方法返回的值需要进行校验

赋值时自动拆箱出现空指针

  1. 变量赋值自动拆箱出现的空指针

 

 

Long 自动拆箱为 long 实质是调用了 longValue 方法,由于以上的 Long 类型变量值为 null,自动拆箱就会报 NPE

  1. 方法传参时自动拆箱引发的空指针

 

 

原因同上,包装类型自动拆箱都需要注意是否为 null

  1. 用于大小比较的场景

 

 

通过字节码可以知晓其中缘由

 

 

 

 

现在就一目了然了,以上自动拆箱报 NPE,原因在于装箱的值为 null,调用 null 的任何 方法都会报错

规避指南:

基本数据类型比包装器类型更加节省时间与空间

https://zhuanlan.zhihu.com/p/354864202

标签:拆箱,调用,java,NULL,类型,null,异常,指针
来源: https://www.cnblogs.com/xiaofeilin/p/16370806.html