Paths.get() / Path.of()在升级到Java 16时抛出NullPointerException.&l



当从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第一个参数为时,一致空。从历史上看,这些方法错过了第一个空检查参数

代码流:

  1. Paths.get内部调用Path.of。(Paths.java)

    public static Path get(String first, String... more) {
    return Path.of(first, more);
    }
    
  2. Path.of代码。(Path.java)

    public static Path of(String first, String... more) {
    return FileSystems.getDefault().getPath(first, more);
    }
    
  3. 然后根据文件系统调用合适的getPath方法。WindowsFileSystem
    b。UnixFileSystem

  4. 在该方法中,我们有一个检查,确认第一个参数/路径是而不是null

    Objects.requireNonNull(first);
    
  5. 当第一个参数为null时抛出NPE。(Objects.java)

    public static <T> T requireNonNull(T obj, String message) {
    if (obj == null)
    throw new NullPointerException(message);
    return obj;
    }
    

相关内容

  • 没有找到相关文章

最新更新