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

StackOverflow https://stackoverflow.com/questions/1533662

Вопрос

МОЙ БОГ.У меня есть небольшой проект, и струны меня убивают!

Теперь у меня есть строка, которая 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) будет ок, но нет.

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

Это было полезно?

Решение

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

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

Очевидно, что строка, которую вы получаете, не является нулевым значением, а представляет собой строку из 4 символов «null».

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

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

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

РЕДАКТИРОВАТЬ2:Хорошо, кажется, некоторые ребята не понимают, что здесь происходит, и говорят, как нулевая строка может быть «нулевой» в некоторых условиях в Java?Они находят это смешным.Я предпочитаю, чтобы они попробовали это на Java:

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

На выходе будет «hellonull». Ничего больше...

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

Другие советы

ID.equals("null")

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

См. Глоссарий Java подробнее о null постоянный.По сути, переменная имеет значение null если он не ссылается ни на один объект.Строка "null" является однако объект, а именно экземпляр класса Нить, и в этом случае переменная ID ссылается на этот объект.

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

Вот четыре теста, которые вы попробовали.Первое и четвертое — единственные, которые вам могут понадобиться.

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

Похоже, он возвращает строку «null», а не нулевой объект.

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

ID == null

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

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

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

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

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

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

if (value==null || value.isEmpty())

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top