为什么 Intellij idea 在 if 条件下警告空指针?

Why does Intellij idea warn about nullpointer in that if condition?

这是我的代码

if (!multipartFile.isEmpty() && multipartFile.getOriginalFilename() != null && !multipartFile.getOriginalFilename().isBlank()) {
            String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
            dishCreationDto.setImageFileName(fileName);
            dishService.saveWithFile(dishCreationDto, multipartFile);
        } else {
            dishService.save(dishCreationDto);
        }

我是这样看代码的 正如您所看到的,IF 条件的最后一部分是下划线的,因为 Idea 认为 getOriginalFilename 可以 return null,但我已经用那行代码检查了这一点 multipartFile.getOriginalFilename() != null。我做错了什么?

您可以使用 StringUtils 简化该表达式:

!StringUtils.isNullOrEmpty(multipartFile.getOriginalFilename())

该实用程序 class 中还有其他功能可能会有所帮助,具体取决于您要执行的操作。

IntelliJ 并不总是正确的,但是更详细地查看我们的代码以查看可以 improved/simplified 变得更好 debugging/readability.

总是好的

Idea thinks that getOriginalFilename can return null

因为可以。

but I've checked this with that line of a code multipartFile.getOriginalFilename() != null

您检查过之前的调用没有 return null。下一个还可以。

What am I doing wrong?

快速连续调用一种方法两次,而不是将其结果存储在变量中并使用该变量进行检查和进一步处理。事实上,你会第三次调用它。

(这只是我上面的评论的副本)

虽然可能有其他答案显示的方法来简化条件,因为您还需要 ifgetOriginalFilename() 的结果,我认为 IDE 会接下来抱怨那个,最后你可能不得不硬着头皮为它准备一个变量:

String originalFilename = multipartFile.getOriginalFilename();
if (!multipartFile.isEmpty() && originalFilename != null && !originalFilename.isBlank()) {
        String fileName = StringUtils.cleanPath(originalFilename);
        dishCreationDto.setImageFileName(fileName);
        dishService.saveWithFile(dishCreationDto, multipartFile);
    } else {
        dishService.save(dishCreationDto);
    }