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依赖。
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 );