系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析相关的知识,希望对你有一定的参考价值。

1 原因分析:
空指针异常都是因为调用null对象的方法,就是一个对象还没有没有正常初始化 就先调用它的方法;程序在使用或访问一个对象的引用时,而该对象等于null则被抛出。

2 场景分析:
2.1 接口类型的对象没有用具体的类初始化;
2.2 访问或修改一个null对象的字段或者求一个数组为null对象的长度或者访问或修改一个数组为null对象中的某一个值;
2.3 返回null,方法的返回值不要定义成为一般的类型,而是用数组。

3 Java中空格字符串" “,空字符串”",和null的区别:
3.1 " “空格字符串 此字符有对应的ASCII码,跟abcd什么的没有区别;
3.2 “”是一个空字符串,是个对象,长度为0在内存中分配一个空间,可以使用Object对象的方法,表示一个字符串对象引用的值为空,String a =”" 声明了一个字符串变量a,变量a的值为空;
3.3 null表示一个对象的值没有分配内存,调用null的字符串的方法会抛出空指针异常,null不是对象,String a=null声明了一个字符串变量a,变量a的引用为空,a没有指向任何的内存空间,在堆中也没有开辟任何的空间。

        String str1="";
        //创建一个字符串对象的默认值为""
        String str2=new String();
        String str3=null;
        //str1和str2被实例化,而str3没有实例化,但str1和str2所指的地址不同,但值一样,都为空
        System.out.println(str1==str1);               //内存地址的比较,返回false
        System.out.println(str1.equals(str2));        //值的比较,返回true
        System.out.println(str2==str3);               //内存地址的比较,返回false
        System.out.println(str2.equals(str3));        //值的比较,返回false
        System.out.println(str1==str3);               //内存地址的比较,返回false
        System.out.println(str1.equals(str3));        //值的比较,返回false

        //空字符串的判断方法:
        if(str1.equals(""))
            System.out.println("str1是一个空字符串");
        
        if(str1=="")
            System.out.println("str1是一个空字符串");
        
        if(str1.length()==0)
            System.out.println("str1是一个空字符串");
        
        if(str1.isEmpty())
            System.out.println("str1是一个空字符串");
        
        //Result:均输出str1是一个空字符串
        
        if(str2.equals(""))
            System.out.println("a、str2是一个空字符串");
        
        //内存地址的比较,不相等,所有没有输出
        if(str2=="")
            System.out.println("b、str2是一个空字符串");
        
        if(str2.length()==0)
            System.out.println("c、str2是一个空字符串");
        
        if(str2.isEmpty())
            System.out.println("d、str2是一个空字符串");
        
        //Result:输出a、c、d

        if(str3==null)
            System.out.println("str3是null字符串");
        
        //解释:为什么null判断不用equals方法
        //由于 null 不是对象,"" 是对象,所以比较的方式是==
        //str3.equals(Object o),后面应该是对象
        /*
        if(str3.equals(null))
            System.out.println("str3是null字符串");
        
        //这里会报Exception in thread "main" java.lang.NullPointerException
         */

4 如何避免空指针异常:
4.1 优先使用String.valueOf()方法代替toString(),当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印"null";
4.2 举例:
假如现在要对一个object对象判断:

//地址比较,永远也不会为false
if (!object =="") 
     //code


//值比较,如果object = null的情况下,程序将抛出NullPointerException异常
if(!object.equals("")) 
     //code

//修改:先加上object != null的条件
if(object!= null && !object.equals("")) 
     //code

OR:
if(!"".equals(object)&& !null.equals ) //将""写在前头,这样,不管object是否为null,都不会出错
     //code

4.3 通过布尔表达式来判断,如果表达式结果为true,则返回value1,否则返回value2;可以使用三元运算符来处理空指针;
4.4 instanceof 即使对象的引用等于 null,也可以使用该运算符。在 instanceof 操作时,参考值等于为null,不抛出 NullPointerException,而是返回 false。

以上是关于系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析的主要内容,如果未能解决你的问题,请参考以下文章

系统运维系列 之MySQL部分学习整理2

系统运维系列 之Clickhouse数据类型整理

系统运维系列 之Clickhouse数据类型整理

系统运维系列 之系统文件pagefile.sys的介绍

系统运维系列 之容器为空和为null的区别

系统运维系列 之系统文件Hiberfil.sys的介绍