不合逻辑的空指针异常

Illogical null pointer exception

我正在做一个 Rest 集成项目,我正在尝试对我正在实施的 API 发出 PUT api 请求。这是开始执行 PUT 操作的代码的一部分。

String name = vivienda.getName();
Vivienda oldVivienda = repository.getViviendas(name);
if (oldVivienda == null) {
    throw new NotFoundException("No se ha encontrado ninguna vivienda con el nombre="+ vivienda.getName());         
}

事情是,当我提出请求时,returns 我在那里声明了 NotFoundException,所以它没有工作。

玩我本地化的代码,错误当然是对象 oldViviendanull,就好像我试图用它的 getName 做点什么一样,它会扔 NullPointerException.

但这就是我开始什么都不懂的地方。我更改了代码以尝试查找错误所在,直接将名称字符串这样放置:

Vivienda oldVivienda = repository.getViviendas("vivienda1");
if (oldVivienda == null) {
    throw new NotFoundException("No se ha encontrado ninguna vivienda con el nombre="+ vivienda.getName());         
}

这非常有效。这会导致认为问题出在参数对象 vivienda 上,它或它的名称是空的或不是 "vivienda1"。但是,还记得例外吗?在异常中我使用 vivienda.getName(),当我看到响应中抛出的错误时,它实际上是 "vivienda1"。所以我发送了很好的对象,当你做 vivienda.getName() 它 returns "vivienda1"。当您将字符串 "vivienda1" 放入 repository.getViviendas("vivienda1") 时,它会完美运行。

那么,问题出在哪里呢?类型有什么问题吗?但是 getName 是一个简单的 get 方法,它 returns 一个字符串。而且我已经检查了好几次是否有 space 某处或某处。错误出在前两行代码中,但我不知道发生了什么。

如果此代码有效

repository.getViviendas("vivienda1");

而以下没有

repository.getViviendas(name); // name is "vivienda1"

这可能意味着 Stringrepository 内部进行的比较不正确。

如果您将两个字符串声明为文字,那么使用 == 运算符的比较将会成功,因为它们将存储在字符串池中。但是,如果其中一个字符串的值是动态输入的(比如来自您的 RESTful API 客户端),那么它将无法工作。

有关 Java 中字符串池的更多详细信息,请阅读 What is String pool in Java?

在Java中比较字符串的正确方法是.equals()方法:

someString.equals(otherString);