2017-08-29 64 views
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,所以它没有工作。

与我本地化的错误是,当然,对象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()时,它返回“vivienda1”。当你把字符串“vivienda1”放入repository.getViviendas("vivienda1")时,它可以很好地工作。

那么,问题在哪里?类型有问题吗?但是getName是一个返回String的简单get方法。我已经多次查看是否有空间或某处有空间。错误在于这两行代码中,但我不知道发生了什么。

+0

你需要使用一些断点调试....它看起来就像这样:*** vivienda.getName(); ***正在返回null –

+1

你的'repository'类里面有什么?如果你使用'repository'中的'=='运算符比较字符串,可以解释这种行为。 –

+2

“_但是,请记住例外情况吗?_”嗯,不,因为你没有提供它。 ;)你确定没有空间或任何东西?请为此例外提供[mcve]。为了以防万一,请使用'vivienda.getName()。trim()'。 – AxelH

回答

1

如果这个代码工作

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);