String s = null;
s = s + "hai";
System.out.println(s);
Output:
nullhai
Thought this would throw me NPE.
What is the fundamental logic behind
+
(concatenation).
An empty string is a string instance of zero length, whereas a null string has no value at all. An empty string is represented as "" . It is a character sequence of zero characters. A null string is represented by null .
This does not happen in your case because your null reference will be converted to a "null" String , no method will be called on the s local variable. This user is first on the weekly Go Language leaderboard.
“A null String is Java is literally equal to a reserved word “null”. It means the String that does not point to any physical address.” In Java programming language, a “null” String is used to refer to nothing. It also indicates that the String variable is not actually tied to any memory location.
For , s = s + "hai";
Internally, String.valueOf(null)
will be called. That method will convert null
to "null"
.
Byte code :
public static void main(java.lang.String[]) throws java.lang.Exception;
0: aconst_null
//some code
10: invokestatic #27; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;// check this line
// some other code
27: return
No it wont.Compiler replaces String concatenation with StringBuilder
operations which doesn't give null pointer exception.Compiler does all this backend and saves our time of writing boiler-plate code.Actually there is no such thing as String
concatenation as String is immutable
Decompiled code:-
String s = null;
s = (new StringBuilder(String.valueOf(s))).append("hai").toString();
System.out.println(s);
So,the answer to your question.
+
concatenation operations using StringBuilder
and String.valueOf
operations.So the compiler makes sure that null cases would be handled.
operator on a String
instance,you invoke methods defined in a String
instance such as String.concat(String str)
which will give a NullPointerException if your String
instance is null NullPointerException
is only thrown if you try to call a method on a reference which is null
(or trying to access a field of it; or you manually throw a NullPointerException
).
This does not happen in your case because your null
reference will be converted to a "null"
String
, no method will be called on the s
local variable.
So for example:
String s = null;
boolean isNull = s == null; // This is ok, just testing the value of s
s.toString(); // NPE, s is null
Also note that static fields can be accessed even if variable is null
:
s.valueOf(12); // THIS IS ALSO OK, valueOf(int) is static
// It is equivalent to:
String.valueOf(12);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With