您好,我正在尝试使用 Java 实现最低有效数字基数排序。在第 130 行,我创建了一个链表数组,它将保存排序后的整数,并在第 133 行将每个元素初始化为一个空链表。一切正常,除非我想遍历这个链表数组以替换第 162 行和第 163 行中的原始输入数组。每次我运行此代码时,我都会收到 NoSuchElementException,但是如果我将第 162 行从 (bucket != null) 更改为 (! bucket.isEmpty()),则代码可以完美运行。检查链表头是否等于 null 和检查链表是否为空不是一回事吗?
我很困惑为什么检查链表头是否不等于 null 会给我一个错误,而检查链表是否为空却不会给我一个错误。谢谢。
不,它们在 Java 中不一样。
在 Java 中,变量(非原始类型)默认为
null
,直到您创建或分配对象给它。
所以如果你的方法包含这个:
List<String> myList;
那么你的变量
myList
将是一个“空指针”(空引用),因为你还没有给它分配任何东西。
如果你的方法然后尝试调用这个空指针上的任何方法,比如这样做:
myList.size();
然后你会遭受
NullPointerException
因为 myList
是 null
所以那里没有对象可以调用 size()
方法。
但是如果您现在为该变量创建一个对象以指向:
myList = new LinkedList();
然后变量将不再是空指针,它现在将是对恰好为空的
List<String>
的引用(因为您还没有向其中添加任何项目)。
所以现在您可以调用
myList.size()
和 myList.isEmpty()
之类的方法而无需获得 NullPointerException
.