如果一个Java程序到处抛出NullPointerException,那么我们可能会各种吐槽代码的质量。但是我们的项目又经常会抛出空指针异常,空指针异常必然常伴Java程序员。为此我们需要了解一些它喽,NullPointerException是Java中一个常见的RuntimeException,正如阿里的Java开发手册所说,对于Java程序员来说防止NPE是一种基本素养。今天我们盘一下NullPointerException。
Java中定义:在应用程序中尝试使用null时会抛出异常。
其中以下的情况会产生NullPointerException
以上是针对各种具体发生异常的情况,而对于日常使用过程中,可能抛出空指针异常的情景非常多,我们常用的手册中提到了以下几种NPE产生的实际使用场景。
如下代码中,代码逻辑出现问题的话,返回就是null。
public int count(){
Integer integer = null;
。。。。。。
return integer;
}
同理如下代码也是同样的问题,均属于自动拆装箱时的NPE问题。
public static Boolean callSuccess(){
return null;
};
从集合取出的值直接使用会遇到NPE.
Map< String,String > map= new HashMap< >();
map.get("test").equals("test");
一般程序中需要处理NPE的地方随处可见,常见的NPE预防介绍如下几种方法。
如下代码
public class Department {
private String departmentName;
private Company company;
...
}
public class Group {
private Department department;
...
}
public class Employee {
private String staffName;
private Group group;
...
}
如果程序中需要如此调用
employee.getGroup().getDepartment().getDepartmentName();
那么每一处均可能出现NullPointerException,如果我们写成下面这样。
if (employee != null){
if(employee.getGroup() != null){
if(employee.getGroup().getDepartment() != null){
String departmentName = employee.getGroup().getDepartment().getDepartmentName();
}
}
}
if嵌套大军来袭,尔等还不下马受死。
上述if嵌套看起来的确很不美观,使用Optional可以比较容易的避免这些if判断,代码也会优雅不少。
下面不管哪一层为null返回均为Default。
String s = Optional.ofNullable(employee)
.map(Employee::getGroup)
.map(Group::getDepartment)
.map(Department::getDepartmentName).orElse("Default");
或者使用如下方法,如果某一层为null则返回Supplier的执行结果。
String s1 = Optional.ofNullable(employee)
.map(Employee::getGroup)
.map(Group::getDepartment)
.map(Department::getDepartmentName).orElseGet(() - > {
return "Supplier default";
});
大部分的源码中使用的基础检查均会检查null
public static String testString(String str) throws Exception {
if (str == null){
throw new Exception("param can't be null");
}
return str;
}
"knownObject".equals(unknownObject)
一些返回数组或者List的方法,如果没有值,尽量返回空集合,避免返回null。
Java14 可以使用增强异常信息来查看NullPointerException
的详细错误信息。Java17已经默认开启。
java -XX:+ShowCodeDetailsInExceptionMessages NPTDemo
使用Java17执行如下语句及NullPointException的输出
Map< String,String > map= new HashMap< >();
map.get("test").equals("test");
E:Javajdk-17.0.1bin >java NPTDemo
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "java.util.Map.get(Object)" is null
at NPTDemo.main(NPTDemo.java:24)
全部0条评论
快来发表一下你的评论吧 !