• 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 的任何 方法都会报错

    规避指南:

    • 基本数据类型优于包装器类型,优先考虑使用基本类型
    • 对于不确定的包装器类型,一定要校验是否为 NULL

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

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

  • 相关阅读:
    1293E. Xenon's Attack on the Gangs (树形DP)
    二分check的妙用
    Educational Codeforces Round 80 (CF
    CodeForces Goodbye2019 E.Divide Points (构造)
    POJ 1061 (拓展欧几里得+求最小正整数解)
    1238D
    关于Mysql用户的相关操作
    JAVA类的符号引用的理解
    关于tomcat的路径等基础问题
    Java 方法中,参数的装配顺序
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/16370806.html
Copyright © 2020-2023  润新知