Странный исключительный случай нулевого указателя: троичный условный оператор не работает с конкатенацией строк - PullRequest
3 голосов
/ 19 июля 2010
StringBuffer sb=null;

// Some more logic that conditionally assigns value to the StringBuffer

// Prints Value=null
System.out.println("Value="+sb);

// Throws NullPointerException
System.out.println("Value=" + sb != null ? sb.toString() : "Null");

Исправление для этой проблемы включает троичный оператор в скобках:

// Works fine
System.out.println("Value=" + (sb != null ? sb.toString() : "Null"));

Как это возможно?

Ответы [ 6 ]

8 голосов
/ 19 июля 2010

A + имеет более высокий приоритет , чем !=.

Итак, сначала вы оцениваете "(Value="+sb ) != null.

5 голосов
/ 19 июля 2010

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

System.out.println( ("Value" + sb != null) ? sb.toString() : "Null");

Теперь "Value" + sb никогда не будет нулевым, даже если sb равно нулю ... так что когда sb равно нулю, он звонит toString() и идет на ура.

4 голосов
/ 19 июля 2010

Я думаю, что проблема в том, что оператор анализируется следующим образом:

System.out.println( ("Value="+sb) != null ? sb.toString() : "Null" );

Оператор конкатенации строк (+) имеет более высокий приоритет, чем троичный оператор.

Поскольку "Value" + null всегда не равно null, sb.toString () всегда будет вызываться, даже если sb равно null, следовательно, NullPointerException.

Если сомневаешься - заключи в скобки! Даже если не сомневаюсь! :)

2 голосов
/ 19 июля 2010

Тернарная операция обходит метод toString для нулевого объекта, что и вызывает NullPointerException.

1 голос
/ 19 июля 2010

исключение является причиной, когда sb.toString () выполняется.

В исправлении вы проверяете, является ли sb нулевым, перед выполнением, чтобы вызывающий вызов не выполнялся.

0 голосов
/ 19 июля 2010

System.out.print () реализован так:

public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
}

С sb = null sb.toString() означает null.toString(), что приводит к исключению NullPointerException

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