不合逻辑的空指针异常
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
,所以它没有工作。
玩我本地化的代码,错误当然是对象 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()
它 returns "vivienda1"。当您将字符串 "vivienda1" 放入 repository.getViviendas("vivienda1")
时,它会完美运行。
那么,问题出在哪里呢?类型有什么问题吗?但是 getName
是一个简单的 get 方法,它 returns 一个字符串。而且我已经检查了好几次是否有 space 某处或某处。错误出在前两行代码中,但我不知道发生了什么。
如果此代码有效
repository.getViviendas("vivienda1");
而以下没有
repository.getViviendas(name); // name is "vivienda1"
这可能意味着 String
在 repository
内部进行的比较不正确。
如果您将两个字符串声明为文字,那么使用 ==
运算符的比较将会成功,因为它们将存储在字符串池中。但是,如果其中一个字符串的值是动态输入的(比如来自您的 RESTful API 客户端),那么它将无法工作。
有关 Java 中字符串池的更多详细信息,请阅读 What is String pool in Java?。
在Java中比较字符串的正确方法是.equals()
方法:
someString.equals(otherString);
我正在做一个 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
,所以它没有工作。
玩我本地化的代码,错误当然是对象 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()
它 returns "vivienda1"。当您将字符串 "vivienda1" 放入 repository.getViviendas("vivienda1")
时,它会完美运行。
那么,问题出在哪里呢?类型有什么问题吗?但是 getName
是一个简单的 get 方法,它 returns 一个字符串。而且我已经检查了好几次是否有 space 某处或某处。错误出在前两行代码中,但我不知道发生了什么。
如果此代码有效
repository.getViviendas("vivienda1");
而以下没有
repository.getViviendas(name); // name is "vivienda1"
这可能意味着 String
在 repository
内部进行的比较不正确。
如果您将两个字符串声明为文字,那么使用 ==
运算符的比较将会成功,因为它们将存储在字符串池中。但是,如果其中一个字符串的值是动态输入的(比如来自您的 RESTful API 客户端),那么它将无法工作。
有关 Java 中字符串池的更多详细信息,请阅读 What is String pool in Java?。
在Java中比较字符串的正确方法是.equals()
方法:
someString.equals(otherString);