系统运维系列 之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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.lang.NullPointerExceptionJava中常见的错误之一,它表示在程序中尝试使用一个空对象的方法或属性。出现这个错误的原因可能有多种,下面是一些常见的原因解决方法: 1. 对空对象进行方法调用:当你尝试对一个空对象调用方法时,就会出现NullPointerException解决方法是在调用方法之前,确保对象不为空。 2. 对空对象进行属性访问:类似于方法调用,如果你尝试访问一个空对象的属性,也会出现NullPointerException解决方法是在访问属性之前,确保对象不为空。 3. 未初始化的变量:如果你使用一个未初始化的变量,也可能导致NullPointerException解决方法是在使用变量之前,确保它已经被正确初始化。 4. 数组访问越界:如果你尝试访问数组中不存在的索引,也会出现NullPointerException解决方法是在访问数组元素之前,确保索引的范围是有效的。 5. 空指针传递:当你将一个空对象作为参数传递给一个方法时,如果该方法没有正确处理空对象,就会出现NullPointerException解决方法是在传递参数之前,确保参数不为空,或者在方法内部进行空对象的检查和处理。 6. 多线程同步问题:在多线程环境下,如果没有正确地同步共享对象的访问,就有可能导致NullPointerException解决方法是使用适当的同步机制来保证线程安全。 总之,避免NullPointerException的关键是在使用对象之前,确保对象不为空。如果无法避免空对象的出现,就需要在代码中进行空对象的检查和处理,以防止出现NullPointerException

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值