Java NullPointerException: null问题3种情况(Java、Dubbo、EasyExcel)解决

1 问题描述

java.lang.NullPointerException: null

2 问题分析

2.1 Java

1、使用了equals()方法,但是使用了该方法的变量为null,导致报错。

解决办法:

String str=null;
if(str!=null&&str.equals("0")){
    return true;
}
return false;

2、包装类转基本类型时,包装类为null,导致报错。

解决办法:

包装类转基本类型之前先判断包装类是否为null。

Integer num1 = null;
if(num1 != null){
 int num2 = num1;
}

3、包装类和基本类型比较时,包装类为null,导致报错。

解决办法:

包装类和基本类型比较之前先判断包装类是否为null。

Integer num1 = null;
int num2 = 1;
bool flag = num1 != null && num1 == num2 ? true : false;

4、使用switch语句时,传参为null,导致报错。

        Integer int1 = null;
        switch (int1) {
            case 1:
                break;
            default:
                break;
        }

解决办法:

使用switch语句之前判断传参是否为null。

        Integer int1 = null;
        if(int1 == null){
            return;
        }
        switch (int1) {
            case 1:
                break;
            default:
                break;
        }

5、使用contains()方法时,调用contains()方法的变量或contain()传参为null。

        String str1 = null;
        String str2 = null;
        return str1.contains(str2);

 解决办法:

使用contains()方法之前判断调用contains()方法的变量或contain()传参是否为null。

        String str1 = null;
        String str2 = null;
        if (str1 == null || str2 == null) {
            return false;
        }
        return str1.contains(str2);

6、三元运算符的返回值同时包含包装类和基本类型时,会将包装类型转换为基本类型,包装类型为null时会报错。

Integer test1 = null;
Integer test2 = null;
//拆箱后变为Integer result = test1 == null ? test2.intValue() : test1.intValue();
Integer result = test1 == null ? test2 : test1.intValue();

解决办法:

三元运算符的返回值全部变为基本类型,或者将有可能为null的包装类型改为直接返回null。

Integer test1 = null;
Integer test2 = null;
//返回值全部变为基本类型
Integer result = test1 == null ? 0: test1.intValue();
//改为直接返回null
Integer result = test1 == null ? null: test1.intValue();

7、使用Collectors.summarizingInt()、Collectors.summingLong()、Collectors.summingDouble()进行求和时,进行求和的属性值存在为null的情况。

List<Integer> list=new ArrayList<>();
long sum = list.stream().collect(Collectors.summingInt(x -> x));

解决办法:

属性值为null设置默认值即可。

List<Integer> list=new ArrayList<>();
long sum = list.stream().collect(Collectors.summingInt(x -> x == null ? 0 : x));

8、使用Float.parseFloat()、Float.valueOf()、Double.parseDouble()、Double.valueOf()等方法将字符串转换成对应的基本类型时,传参为null,导致报错。 

        String str = null;
        Float.parseFloat(str);
        Float.valueOf(str);
        Double.parseDouble(str);
        Double.valueOf(str);

解决办法:

        在使用Float.parseFloat()、Float.valueOf()、Double.parseDouble()、Double.valueOf()等方法之前,先用StrUtil.isNotEmpty()判断传参是否为null或空字符

        String str = null;
        Float num1 = StrUtil.isNotEmpty(str) ? Float.parseFloat(str) : null;
        Float num2 = StrUtil.isNotEmpty(str) ? Float.valueOf(str) : null;
        Double num3 = StrUtil.isNotEmpty(str) ? Double.parseDouble(str) : null;
        Double num4 = StrUtil.isNotEmpty(str) ? Double.valueOf(str) : null;

注:

        StrUtil.isNotEmpty()方法需要引入Hutool依赖。

Hutool Java工具类库使用_旭东怪的博客-CSDN博客1 简介Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。https://blog.csdn.net/qq_38974638/article/details/112977621

2.2 Dubbo

1、引用其他微服务时使用了jdk.nashorn.internal.ir.annotations.Reference注解,导致装配失败,@Reference对应的类为null。

解决办法:

将jdk.nashorn.internal.ir.annotations.Reference换成org.apache.dubbo.config.annotation.Reference。

import org.apache.dubbo.config.annotation.Reference;

2.3 EasyExcel

1、使用ExcelWriter.write(List data, WriteSheet writeSheet, WriteTable writeTable)写数据时,writeTable的List<List<String>> head属性中的元素包含null,导致报错。

问题解决:

使用WriteTable.setHead(List<List<String>> head)方法给head赋值之前,将赋值List中的null全部变为空字符。

        WriteTable table = new WriteTable();
        table.setTableNo(1);
        List<List<String>> head = new ArrayList<>();
        for (int i = 0; i < head.size(); i++) {
            List<String> rowList = head.get(i);
            for (int j = 0; j < rowList.size(); j++) {
                if (rowList.get(j) == null) {
                    rowList.set(j, "");
                }
            }
        }
        table.setHead(head );

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值