null和空字符串的区别

55

一个null字符串(String s = null)和一个空字符串(String s = "")之间有什么区别?

这是我的回答:

String s1 = ""; //print statement does not print any thing for s1 but s1.length()=0
String s2 = null;//print statement prints "null" for s2  but s2.length() gives exception

它是什么意思?


5
这个问题之前已经被问过了(并且得到了很好的回答):https://dev59.com/qG445IYBdhLWcg3wkLBG - Cat
@Eric 是类似的问题,但我的意图是想知道为什么 s1.length() 返回零而 s2.length() 抛出异常..不管怎样,谢谢,我在你提供的链接页面上得到了更详细的信息。 - Shakeeb Ayaz
4个回答

75

String s1 = ""; 表示将空的 String 赋值给 s1。在这种情况下,s1.length()"".length() 是相同的,会得到预期的结果 0

String s2 = null; 表示将 (null) 或者 "没有任何值" 赋值给 s2。因此,s2.length()null.length() 是相同的,会导致 NullPointerException,因为在 Java 中不能在 null 变量(指针)上调用方法。

还需要注意的是,这个语句:

String s1;

实际上具有与以下相同的效果:

String s1 = null;

鉴于

String s1 = "";

正如所说,这是一件不同的事情。


10

Null 意味着什么也没有。它只是一个字面量。 Null 是引用变量的值。但是空字符串是空白的,它给出了length=0。 空字符串是一个空值,意味着该字符串没有任何内容。


7

对于被赋值为NULL的对象,无法调用任何方法。这将导致nullPointerException异常。因此,s2.length()会引发异常。


@Alexis Wilke:当字符串s = null + "a"时,它会输出nulla,但是null.concat("a")会导致空指针异常。为什么在我的第一个例子中null+"";可以正常工作? - Onic Team
大体上说,当你执行 <object> + <string> 时,编译器会尝试将 <object> 转换为字符串。有点像 <object>.toString() + <string>,不过对于 null 来说这是一个特例,因为你无法从 null 调用函数。 - Alexis Wilke

4
当在Java这样的语言中最初使用对象变量时,它们根本没有任何值 - 不是零,而是真正的没有值 - 这就是 "null"。例如:String s;。如果您使用了s,它实际上会具有null的值,因为它什么也没有。然而,空字符串是一个值 - 它是一个没有字符的字符串。
String s; //Inits to null
String a =""; //A blank string
Null本质上是“无”-它是Java分配给任何未初始化的对象变量的默认“值”(使用该术语并不严谨)。 Null实际上不是一个值,因此没有属性。因此,调用任何旨在返回值的东西-例如.length(),将不可避免地返回错误,因为“无”不能有属性。
更深入地说,通过创建s1 ="";,您正在初始化一个对象,该对象可以具有属性,并占用相关的内存空间。通过使用s2;,您指定该变量名为String,但在那一点上实际上没有指定任何值。

2
这个解释真的很混乱。一个值类型不能为null。 - carlosdc
@carlosdc 你能详细说明一下吗?你说的值类型不能为null是什么意思? - Singular1ty
尝试在Java中使用“int i = null;”。 - carlosdc
1
不要将其转换为int、char、double、float、short或boolean。你试图过于简化解释,这是错误的。 - carlosdc
@carlosdc,我稍微修改了一下我的帖子。 - Singular1ty
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接