2021.5.6:NullPointerException
Java标准库定义的常用异常包括:
在所有的RuntimeException异常中,最常用的是NullPointerException,即空指针异常,俗称NPE。如果一个对象是null,调用其方法或者访问其属性时就会产生NullPointerException,这个异常通常是由JVM抛出的。
处理NullPointerException
必须明确的是,NullPointerException是一种代码逻辑错误,遇到NullPointerException,遵循原则是早暴露、早修复,严禁使用catch来隐藏这种编码错误,好的编码习惯可以极大地降低NullPointerException的产生,例如:
- 初始化String为空字符串""而非null
public class Person{ private String name=""; }
使用空字符串""而不是默认的null可以避免很多NullPointerException,编写业务逻辑时,用空字符串""表示未填写比null安全很多。
- 返回空字符串""、空数组而不是null:
public String[] readLinesFromFile(String file){ if(getFileSize(file)==0){ //返回空数组而非null return new String[0]; } }
这样可以使得调用方无须检查结果是否为null。
- 如果调用方一定要根据null判断,比如返回null表示文件不存在,那么可以考虑返回Optional<T>:
public Optional <String> readFromFile(String file){ if(!fileExist(file)){ return Optional.empty(); } ... }
这样调用方必须通过Optional.isPresent()判断是否有结果。
定位NullPointerException
从Java 14开始,如果产生了NullPointerException,JVM可以给出详细的信息告诉我们null对象到底是谁。
可以在NullPointerException的详细信息中心看到类似because xxx is null的语句,直接指明xxx是null,装我们就能快速定位问题所在。
这种方法是Java14新增的功能,但是默认是关闭的,我们可以给运行Java文件时,通过参数-XX:+ShowCodeDetailsInExceptionMessages来启用它:
java -XX:+ShowCodeDetailsInExceptionMessages Main.java