if (str1 == null), когда выбрасывает исключение NullPointerException - PullRequest
2 голосов
/ 14 мая 2010

В Java, есть ли в следующей строке возможность (даже 0,01%) вызвать исключение NullPointerException ??

public static void handleRequest(String str1){
   if (str1 == null){  // this line throws NPE, how come !! is it a JDK1.5 bug!!
        return null;
   }
   // other staff
}

На самом деле я обнаружил ошибку в коде, и он говорит, что строка exact выше в методе вызывает java.lang.NullPointerException?!

Ответы [ 4 ]

19 голосов
/ 14 мая 2010

Нет, эта строка не будет выбрасывать NullPointerException ни при каких обстоятельствах.

Но это зависит от того, что вы подразумеваете под "подобным". Например, если ваша фактическая строка кода

if (foo.str1 == null)

тогда вы получите исключение NullPointerException, если foo равно нулю.

10 голосов
/ 14 мая 2010
if (str1 == null)  

не вызовет исключение NullPointerException.

if(str1.equals(null)) 

имеет такую ​​возможность.

EDIT:

Если на приведенную выше строку ссылается ваша трассировка стека, существует очень реальная вероятность того, что выполняемый код не совпадает с кодом, который вы просматриваете. Это может произойти, если вы внесли изменения в класс после того, как скомпилировали и развернули его, что приведет к несовпадению номеров строк.

4 голосов
/ 14 мая 2010

Нет,

if (str1 == null)

не может выдать исключение нулевого указателя, так как ни один указатель не разыменован.

Аналог

if (obj1.getStr1() == null)

может бросить NPE в случае, если obj1 == null, или

if (str1 == null && str1.length() == 0)

сгенерирует NPE для str1.length (), когда str1 == null. (В этом случае должен был использоваться оператор ||.)

Можете ли вы показать точную линию, на которой он разбивается, и включить трассировку стека?

3 голосов
/ 14 мая 2010

Если у вас есть манипулирование байтовым кодом, например, в компонентах OSGi доступ к полю можно заменить проксированными методами получения. Если вы обращаетесь к полю после того, как базовый компонент был удален, доступ к полям вызывает NPE, потому что он был заменен следующим, и thisObject имеет значение null.

if (thisObject.getStr1() == null)

Кстати: у меня была ошибка, связанная с этой самой проблемой сегодня. : P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...