什么意思是null指向什么都没有,为什么一直使用null?

时间:2013-10-31 01:59:47

标签: java pointers null

关于null和java有很多问题。

我无法理解的是,人们所说的null意味着什么都没有,或者为什么要使用null。

我无法理解

之间的区别
String thing = null;

String thing = "";

这个问题有详细的答案What is null in Java?,但我无法绕过它。

我错过了什么?


我研究过的语言(没有专家)

Python,vb(vb.net),网页编程(html,css,php,bit of js),sql

我应该补充一下,正是这个答案https://stackoverflow.com/a/19697058/2776866促使我写下这个。

8 个答案:

答案 0 :(得分:6)

String str = null;

表示名为str的String引用,不指向任何内容

String str = "";

表示名为str的String引用,指向实际的String实例。对于该String实例,它是一个零长度的String,但它仍然是一个实际的对象。


只需稍微更新一些图表,希望可以帮助您想象:

假设我有

String nullStr = null;
String emptyStr = "";
String myStr = "ab";

概念上看起来像是什么:

  // String nullStr = null;

  nullStr ----------> X    pointing to nothing



  // String emptyStr = "";
                      +------------------+
  emptyStr ---------> |       String     |
                      +------------------+
                      | length = 0       |
                      | content = []     |
                      +------------------+


  // String myStr = "ab";
                      +------------------+
  myStr ------------> |       String     |
                      +------------------+
                      | length = 2       |
                      | content = [ab]   |
                      +------------------+

(当然,String对象的内部结构不是Java中的真实内容,只是为了给你一个想法)


更多编辑NULL背后的基本原理:

事实上,在某些语言中,它们不提供NULL的概念。无论如何,在Java(或类似语言)中,Null意味着与“空”对象在语义上不同。以String为例,我可能有People类,其中包含String preferedTitle属性。 Null preferedTitle表示该人员有 NO 首选标题(因此我们需要派生并显示该标题),而{ {1}}是一个空字符串意味着 IS 是一个首选标题,并且没有显示任何内容。

不过,虽然有点偏离主题:Null的概念被认为对某些人来说是有问题的(因为所有那些需要的额外处理等等)。因此,一些语言(例如Haskell)正在使用其他一些方法来处理我们曾经使用Null的情况。

答案 1 :(得分:4)

Java并不真正公开指针,而是处理引用。

当你说

String thing = null;

你说有一个名为thing的引用(类型为string),它没有引用任何东西。

当你说

String thing = ""

这是简写,

String thing = new String("");

现在您已初始化实际对象并准备使用。你告诉编译器创建一个字符串,现在你的“东西”引用了新的字符串。

如果你想知道你初始化字符串的长度,你可以去;

thing.length

哪个是零。该字符串存在,但长度为零。

在null版本上尝试string.length会导致NullReferenceException,这是编译器说的

  

“我试图找出你的字符串长度,但我找不到它!”

答案 2 :(得分:4)

String str是对象的引用。也就是说,它不是一个实际的对象,而是一个可以包含对象地址的变量。为str指定值时,您正在更改存储在其中的地址并更改它所处理的对象。

null是指向无对象的参考值。你可以得到的几乎没有任何东西。如果将null分配给字符串引用(String str = null;),则无法使用该引用调用任何String方法 - 所有尝试都将导致NullPointerException。

""是一个字符串,不包含任何字符 - 零长度。但它仍然是一个对象,如果将其地址分配给String引用变量(String str = "";),则可以获取其长度,将其与另一个String进行比较,提取其hashCode等。

答案 3 :(得分:3)

实际上,null表示“不适用于调用方法”。如果允许对象为null,则必须在调用方法之前检查null

尝试在null对象上调用任何方法都是无条件的错误。在几乎所有情况下,这也是一个编程错误,因为你应该

  • 确保变量始终为非null或
  • 在调用方法之前检查一个合法的null变量。

另一方面,空对象允许您调用方法。例如,您可以找到空字符串的长度 - 它为零。您还可以迭代一个字符串,将其传递给期望非空字符串的方法,依此类推。

要想象这一点,请考虑使用Boolean对象而不是String。与只有两个状态的原始boolean不同,即true(“是”)和false(“否”),Boolean对象有三种状态:

  • 没有
  • 不知道

第三个“不知道”状态对应null。它既不是true也不是false州。您的程序可以使用此第三种状态 - 例如,您可以使用与null的比较来查看是否已设置值,或将值设置为null以“取消设置”其值。

答案 4 :(得分:2)

在Java null中,空字符串是两个不同的东西。

如果String为null,则无法访问其方法,因为它将抛出NullPointerException,但是如果String为"",则String对象有效,您可以访问其方法。

例如

 String a = null;
 String b = "";

 System.out.println (a.length());   // No Good
 System.out.println (b.length());   // Prints 0

答案 5 :(得分:2)

概念上null是一个特殊值,表示变量指向无效对象,因此它不会引用任何有效的内容,因为您无法访问其内容(变量或方法)。

你可以把它看作是一种特殊的条件,它已被添加到语言中,因为能够有指向什么都没有的指针是有用的。但是这里存在一些不一致,事实上有些语言通过强迫你获得有意义的(有意义的)值来阻止null值的必要性。

您的示例有所不同,""是一个有效对象:它是一个空字符串,而null不是有效对象。

答案 6 :(得分:2)

让我们将它与Python进行比较。在Python中,等同于null的是None

>>> test = ""
>>> test1 = None

这是设置一个空字符串和一个“null”字符串。

>>> test
''
>>> test1
None

在Python中,我们可以使用is

测试无效性
>>> test is None
False
>>> test1 is None
True

我们可以使用==

测试空字符串
>>> test == ""
True
>>> test1 == ""
False

null(如None)缺少值。

答案 7 :(得分:2)

尽管许多面向对象的框架使用指针实现引用,但最好将引用视为“指向”对象,而不是“识别”它们[个人而言,我喜欢这个术语用于描述引用的“对象标识符”,因为术语“引用”在不同的上下文中有些过载]。尽管对象标识符不是人类可读的,但可以想象系统为每个对象赋予从1开始的相关数字,并且每个类型变量具有写入其上的对象编号或零。由于类型变量和数组槽默认为保持零,并且永远不会有第0个对象,因此未初始化的变量或数组槽的默认值变量不会识别有效对象。