Строка говорит, что это не ноль, но потом выдает исключение NullPointerException - PullRequest
2 голосов
/ 07 октября 2009

OMG. У меня есть небольшой проект, и Струны убивают меня!

Теперь у меня есть строка, которая null (берется значение из вызова getParameter() из сервлета).

Проблема в том, что я пытаюсь увидеть, является ли оно нулевым, и, даже если оно нулевое, в программе сообщается мне, что это не null, но позже в программе, когда я использую переменную , Я получаю исключение, сказав, что переменная null.

    System.out.println("In  " + ID); // in console: In null
    if ((ID == null) || (ID == "null") || ID.equals(null) || **ID.equals("null")**)
    {

       // after I put the 4th condition, the if is working right (WHAT IS THE PROBLEM?)            
        System.out.println("==null");
        this.ID = "";
    }
    else
    {
        System.out.println("!=null");
        this.ID = ID;
    }
    System.out.println("After " + ID);

Что я делаю не так?

Работает только четвертое условие! А как насчет остальных (кроме второго, потому что я поставил это условие, потому что был в отчаянии)

Я учил ID == null или ID.equals(null) все будет хорошо, но нет.

Edit: Проблема в том, что я получаю значение идентификатора из формы (скажем, форма 1 - обычно). Но в этом случае я использую форму 2, которая не имеет никаких ID-входов, поэтому ID должен быть null, а не "null"

Ответы [ 7 ]

10 голосов
/ 07 октября 2009
ID.equals("null")

Очевидно, ID содержит четырехбуквенную строку "null". Так что это не null (значение для «ничего»).

См. Java глоссарий для получения дополнительной информации о константе null. В основном переменная имеет значение null, если она не ссылается ни на один объект. Однако строка "null" является объектом, а именно экземпляром класса String , и в этом случае переменная ID ссылается на этот объект.

(Обратите внимание, что по соглашению переменные Java начинаются со строчной буквы, а сокращения, подобные ID, пишутся полностью строчными, поэтому пишите id вместо ID.)

6 голосов
/ 07 октября 2009

Вот четыре теста, которые вы пробовали. Первый и четвертый - единственные, которые вам нужны.

  • ID == null: поле 'ID' равно нулю?
  • ID == "null": является ли ссылка для поля 'ID' такой же, как вновь выделенная String "null"? Обычно это должно возвращать false.
  • ID.equals(null): это всегда должно возвращать false - концептуально, если это когда-либо так, вы должны бросить NullPointerException.
  • ID.equals("null"): значение String 'ID' совпадает со значением String "null"?
5 голосов
/ 07 октября 2009

Поскольку вы получаете строку из сервлета, я могу сказать, что это нормально.

Java преобразует пустую строку в пустую при некоторых условиях.

Очевидно, что полученная вами строка не является нулевым значением, но это строка из 4 символов "null"

Почему бы вам не попробовать отладку? Или просто посмотрите, что это возвращает:

System.out.println("Length of ID:  " + ID.Length);

Редактировать: Если вы не получите здесь исключение, это означает, что строка не равна нулю, а также вывод «Длина идентификатора: 4» будет означать, что строка действительно ID = «пусто»

EDIT2: Хорошо, кажется, что некоторые парни не понимают, что здесь происходит, и они говорят, как пустая строка может быть "нулевой" в некоторых условиях в Java? Они находят это Riddiculus. Я предпочитаю, чтобы они попробовали это на Java:

String abc = null;
String xyz = "hello"; 
System.out.println(xyz + abc); 

На выходе будет "hellonull". Ничего другого ...

Также здесь у нас есть сервлет. Есть нулевые данные. Сервлет отправляет нулевые данные как «нулевые», что он должен делать? Пустая строка? Давай!!! "

2 голосов
/ 07 октября 2009

Похоже, что это возвращает строку "ноль", а не нулевой объект.

0 голосов
/ 08 октября 2009

Если значением идентификатора вашей переменной является строковый литерал «null», то я бы предположил, что ранее в коде была ошибка, когда вы извлекали ее с помощью метода getParameter (). Согласно документам, метод getParameter () должен возвращать ноль (нулевая ссылка), если для указанного имени нет значения. Это означает, что где-то вы выполняете операцию, которая преобразует результат в строковый литерал, возможно, конкатенируя с пустой строкой (т. Е. ID + "";)

0 голосов
/ 08 октября 2009

Если значение поступает из сервлета, то контейнер, скорее всего, преобразует пустое поле формы в пустую строку. Вы должны сделать проверку на пустое и пустое ("").

if (value==null || value.equals(""))

В качестве альтернативы вы можете использовать метод String's isEmpty():

if (value==null || value.isEmpty())
0 голосов
/ 07 октября 2009

Если результат был фактически нулевым, то

ID == null

было бы достаточно, но, как уже упоминалось, строковое значение идентификатора, очевидно, является "нулевым", а не нулевым объектом.

Вы должны использовать .equals при сравнении строк, а не == Этот блог объясняет больше о его: http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

Итак, в Java "ноль" не равно нулю.

...