This question already has answers here:
What is a NullPointerException, and how do I fix it?

(12个答案)


3年前关闭。




我正在做一个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());
}

问题是,当我执行请求时,它返回了在那里声明的NotFoundException,所以它不起作用。

使用代码时,我发现错误是因为对象oldVivienda当然是null,好像我尝试对其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()时,它返回“vivienda1”。并且当您将字符串“vivienda1”放入repository.getViviendas("vivienda1")时,它可以完美工作。

那么,问题出在哪里呢?类型有问题吗?但是getName是返回String的简单get方法。我已经检查了好几次,是否有地方或其他地方。错误在于前两行代码,但我不知道发生了什么。

最佳答案

如果此代码有效

repository.getViviendas("vivienda1");

而以下不
repository.getViviendas(name); // name is "vivienda1"

这可能意味着String比较在repository内部没有正确完成。

如果您将两个字符串声明为文字,那么使用==运算符进行的比较将成功,因为它们将存储在字符串池中。但是,如果这些字符串之一的值是动态输入的(例如来自RESTful API客户端),则它将不起作用。

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

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

10-08 13:26