当从Java 15升级到Java 16时,由于空指针异常,我的一些单元测试开始失败。该问题是由传递给Paths.get() api的空值引起的。Java 16中发生了什么变化,导致这个错误?
我使用的是OpenJDK 16.0.2版本,在macos上运行。
从Java 16开始,内部调用path .of()的Paths.get()的实现现在显式要求'first' path元素非空。
这是对Java 15的一个实现更改,但与规范一致。java.nio.files的javadoc包声明"除非另有说明,否则将null参数传递给此包中任何类或接口的构造函数或方法将导致抛出NullPointerException。">
这个实现变化可以被考虑和改进,因为它将不再隐藏字符串值"null"出现在文件系统路径中,这可能不是期望的结果。
在本例中,单元测试由于未正确初始化模拟对象而中断。
当Paths.get()
或Path.of()
的第一个参数是null
时,这是一个预期的异常。Java 16中有一个已知的bug,现在已经修复了释放。
错误:链接
在Jdk 16中有提到发行说明也是如此。链接
(fs)当第一个参数指向路径时未抛出NullPointerException。或路径。get Is null (JDK-8254876)
core- libraries/java。var参数形式Path.of()和Paths.get()方法在此版本中更改为把NullPointerException第一个参数为时,一致空。从历史上看,这些方法错过了第一个空检查参数
代码流:
-
Paths.get
内部调用Path.of
。(Paths.java)public static Path get(String first, String... more) { return Path.of(first, more); }
-
Path.of
代码。(Path.java)public static Path of(String first, String... more) { return FileSystems.getDefault().getPath(first, more); }
-
然后根据文件系统调用合适的
getPath
方法。WindowsFileSystem
b。UnixFileSystem -
在该方法中,我们有一个检查,确认第一个参数/路径是而不是
null
Objects.requireNonNull(first);
-
当第一个参数为
null
时抛出NPE。(Objects.java)public static <T> T requireNonNull(T obj, String message) { if (obj == null) throw new NullPointerException(message); return obj; }