Why String verkettet NULL mit + Operator und löst NullPointerException mit der concate () Methode aus

7

Hier ist meine Klasse, wo ich zwei Saiten verkette. String-Verkettung mit null mit + -Operator wird problemlos ausgeführt, aber löst NullPointerException mit concate() method aus.

%Vor%

kann mir jemand den Grund dafür sagen?

    
kavi temre 02.05.2015, 14:06
quelle

9 Antworten

7

Fall 1:

%Vor%

Aus den Dokumenten (String-Konvertierung)

  

Wenn die Referenz null ist, wird sie in die Zeichenfolge "null" (vier) konvertiert   ASCII-Zeichen n, u, l, l).

     

Andernfalls wird die Konvertierung wie durch einen Aufruf von   toString-Methode des referenzierten Objekts ohne Argumente; aber wenn das   Ergebnis des Aufrufs der toString-Methode ist null, dann die Zeichenfolge "null"   wird stattdessen verwendet.

Fall 2:

%Vor%

Wenn Sie die source von concat(String str) es verwendet str.length(); , also wäre es wie null.length() , was dir ein NullPointerException gibt.

    
silentprogrammer 02.05.2015, 14:27
quelle
6

Wenn Sie in der java.lang.String-Quelle sehen und null als Parameter verwenden. NPE wird ausgelöst in der ersten Zeile in der length () Methode.

%Vor%     
Zigac 02.05.2015 14:11
quelle
2

Da in der concat -Methode in der String-Klasse die length -Methode auf übergebenen Parameter aufgerufen wird, aufgrund dessen NPE geworfen wird.

%Vor%     
sol4me 02.05.2015 14:11
quelle
2

Die tatsächliche Implementierung der Konkatemethode ist wie folgt. Diese Methode benötigt ein Objekt vom Typ String als Parameter, und wenn das Argument null ist, wird Null Pointer Exp.

ausgegeben %Vor%     
java guy 02.05.2015 14:20
quelle
2

String.concat() benötigt ein Objekt vom Typ String als Parameter.

Es gibt keinen Typ, bei dem null ein instanceof ist. Siehe JLS:

  

15.20.2 Typvergleichsoperator instanceof

     

Relationale Expression:       RelationalExpression-Instanz von ReferenceType   Zur Laufzeit ist das Ergebnis des instanceof-Operators wahr, wenn der Wert der RelationalExpression nicht null ist und die Referenz in den ReferenceType umgewandelt werden kann, ohne dass eine ClassCastException ausgelöst wird. Ansonsten ist das Ergebnis falsch.

    
kaykay 02.05.2015 14:17
quelle
2

concate() Methode erstellt new String() Objekt unter der Haube.

wobei + combinates \ Werte verkettet, indem toString() method verwendet wird. Deshalb verwenden wir + continents "somevalue".append(null).toString() .

für Referenz siehe diese Frage.

    
Muneeb Nasir 02.05.2015 14:15
quelle
1

Die Klasse String enthält ein Array (wahrscheinlich ein ArrayList ) von Zeichen. Wenn Sie .concat() aufrufen, geht es durch und fügt jedes Zeichen aus der zweiten Zeichenfolge zur ersten hinzu.

Wenn der erste String null ist, gibt es nichts hinzuzufügen, was zu einem NullPointer Exception führt. Versuchen Sie, String s mit "" zu initialisieren.

    
MLavrentyev 02.05.2015 14:11
quelle
1

@Blip: 1) null + "ABC"

Gerade Antwort auf Ihre Frage ist + Operator in Java verwendet StringBuilder.append-Methode, um die Zeichenfolgen zu concat.

Und StringBuilder.append () -Methode behandelt Null-Objekt als "Null" String. Daher gibt Null + "ABC" keine Nullzeiger-Ausnahme, sondern gibt nullABC aus.

2) String.concat ()

Und ja, vor der string.length () Methode in der concat () Funktion der String Klasse gibt es keinen Null-Check. Daher wird eine Nullzeigerausnahme ausgelöst.

Hoffe das beantwortet Ihre Frage.

    
Jack 03.09.2015 11:08
quelle
-3

Das Initialisieren einer Null-Zeichenfolge mit "" sollte funktionieren.

    
Jacare 02.05.2015 14:11
quelle

Tags und Links