if (String! = null) все еще проходит? - PullRequest
2 голосов
/ 16 января 2012

Иногда, ну да, довольно часто мне нужно посмотреть, является ли строка нулевой или нет, поэтому я использую условное выражение так:

if(str != null) {
}

До сегодняшнего дня это работало нормально, теперь дажепустые строки проходят по какой-то причине, которую я не получаю.Кто-нибудь знает объяснение?или решение?

Редактировать: ОК, поэтому по какой-то причине строка не выглядит пустой, что очень странно, поскольку я никогда не определял, что это было, только определял, что она существует.Таким образом, вместо строки была строка слова «ноль».Что я совершенно не знаю, почему это будет?Когда я делаю следующее:

String str;

, тогда оно автоматически становится нулевым, верно?И в любом случае, если это не так, почему он становится строкой «ноль»?

Ответы [ 7 ]

9 голосов
/ 16 января 2012

Объяснение в том, что ваш диагноз неверен. Если str равно нулю, тело этого оператора if не будет выполнено - это так просто. Вы ничего не сказали о том, как вы диагностировали, что str является нулем, но этот код все еще выполняется - если это потому, что вы видите NullPointerException, есть различные причины, по которым вы могли бы все еще получаю это. В частности, это может быть связано с разыменованием другого выражения, когда null в блоке if.

В качестве альтернативы, является ли str нелокальной переменной, измененной другими потоками, случайно?

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

1 голос
/ 17 января 2012

И в любом случае, если это не так, почему он стал бы строкой "null"?

Если вы натолкнетесь на строку со значением «null» (4-символьное слово, а не нулевая ссылка), то вы или кто-то другой установили эту строку в «n» - «u» - «l» - «l» ». Возможно, вы сделали это без смысла. Если вы имели в виду это:

str = null

Возможно, вы набрали это:

str = "null"

Скомпилируйте и запустите эту тестовую программу, затем удалите кавычки в строке str = "null". Скомпилируйте и запустите снова - вы увидите другое поведение.

public class shortfile {
    public static void main(String[] argv) {
        String str;
        str = "null";
        if (str == null) {
            System.out.println("str is really a null reference");
        }
        else {
            int len = str.length();
            System.out.println("We set str to the literal word null");
            System.out.println("str's length is " + len);
        }
    }
}
1 голос
/ 16 января 2012

Возможная причина состоит в том, чтобы вообще исключить фигурные скобки в многострочном условном блоке:

if(str != null)
    callSomeMethod();
    System.out.println("length=" + str.length());

В этом классном (и классическом) примере System.out.println всегда будет выполняться, поскольку он эквивалентен:

if(str != null) {
    callSomeMethod();
}
System.out.println("length=" + str.length());

-

Просто подумал о другой возможной ловушке:

if(str != null) {
    System.out.println("str=" + str);
}

Если печатается:

str=null

тогда значение str может быть «нулевым» (четырехзначное слово «нулевой»).

1 голос
/ 16 января 2012

Исходя из того, что ваш ноль в нижнем регистре, я предполагаю, что вы используете Java или C #.

Классический способ для выполнения оператора if, когда он явно ложный, состоит в том, что вы случайно ставите точку с запятой в конце.Например,

if (false);
{
    System.out.println("How can this be happening!?");
}

Я рекомендую очень внимательно посмотреть на ваши операторы if и, при необходимости, поместить printlns в предложения if и else.Я гарантирую вам, если (str! = Null) определенно не будет работать, когда str равен нулю.

0 голосов
/ 16 января 2012

Извините за не по теме, но я помню, как однажды попал в похожую ситуацию из-за ';'(точка с запятой), которая кралась в конец строки условия if.Это меня очень смутило, потому что независимо от того, как я изменил условие, всегда выполнялся следующий блок кода ... Я обнаружил проблему через час, когда скопировал и вставил блок кода в текстовый редактор.

0 голосов
/ 16 января 2012

Это, вероятно, из-за пустых строк или строк с пробельными символами.Используйте следующий код:

if(str != null && !str.trim().isEmpty()) {
}

РЕДАКТИРОВАТЬ: Извините за неправильное прочтение и отправку быстрого решения, прежде чем я приступил к работе.

Может быть, проверка на ноль завершается неудачей из-за того, как «ноль»интерпретируется различными языками программирования или библиотеками.Ниже приведены некоторые интересные ссылки с хорошим обсуждением:

1) Stackoverflow - что такое нуль в Java?

2) Stackoverflow - где ноль в памяти?

3) Stackoverlfow - Null \ u0000 в строке Java?

0 голосов
/ 16 января 2012

Я бы также проверил длину после проверки на ноль:

if(stringVar == null || stringVar.length() == 0) { /* DO STUFF */ }

Чтобы упростить жизнь, вы можете сделать метод расширения:

public static boolean notEmpty(String s) 
{ 
return (s != null && s.length() > 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...