3 Stimmen

Seltsamer Ausnahmefall eines Null-Zeigers: ternärer bedingter Operator funktioniert nicht mit String-Verkettung

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");

Die Lösung für dieses Problem besteht darin, den ternären Operator in Klammern einzuschließen:

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

Wie ist das möglich?

8voto

tanascius Punkte 51555

A + hat einen höheren Vorrang als eine != .

Sie bewerten also "(Value="+sb ) != null anfangs.

6voto

Jon Skeet Punkte 1325502

Klammern wir den Ausdruck so ein, wie es der Compiler in der zerbrochenen Vase tun würde:

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

Jetzt "Value" + sb wird niemals null sein, auch wenn sb ist null... also wenn sb ist null, ruft es toString() und es knallt.

4voto

andrewmu Punkte 13820

Ich denke, das Problem ist, dass die Aussage so interpretiert wird:

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

Der Operator für die Verkettung von Zeichenfolgen (+) hat einen höheren Vorrang als der ternäre Operator.

Da "Value "+null immer nicht null ist, wird sb.toString() immer aufgerufen, auch wenn sb null ist, daher die NullPointerException.

Im Zweifelsfall in Klammern setzen! Auch wenn Sie nicht zweifeln! :)

2voto

BobTurbo Punkte 1055

Die ternäre Operation umgeht die toString-Methode für das Null-Objekt, was die NullPointerException verursacht.

1voto

objects Punkte 8551

Die Ausnahme wird verursacht, wenn sb.toString() ausgeführt wird.

In der Korrektur überprüfen Sie, ob sb vor der Ausführung null ist, damit der verletzende Aufruf nicht versucht wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X