我是Java的初学者,我有一些null
的问题。我需要帮助理解以下问题。我已经正确地回答了这些问题,但是我不知道背后的确切原因。
问题:
假设track是用ArrayList类型声明的,考虑如下:
public Track mostPlayed() {
Track most = tracks.get(0);
int i = 1;
while(i < tracks.size()) {
Track t = tracks.get(i);
if (t.getPlayCount() > most.getPlayCount()) {
most = t;
}
i++;
}
return most;
}
假设在执行mostPlayed
方法期间抛出NullPointerException。假设单线程执行,由于此异常,只有以下一行代码是可能的。哪一个?
我选择了第2行,因为它似乎是唯一合乎逻辑的答案,但我希望得到进一步的解释,因为我不完全理解这个概念。
t.getPlayCount()
可以抛出一个NullPointerException,如果ArrayList轨道包含一个'null'在某些索引。
和Track most = tracks.get(0);
也可以抛出一个NullPointerException,如果轨道没有初始化
Track most = tracks.get(0);
行可以抛出NullPointerException
,因为代码没有显示track
是否初始化。如果不是,它将是null
,如果null
中没有方法get
(实际上根本没有方法)。
Java是一种面向对象的编程语言,对象作为基本的构建块。
在许多现实生活中,存在不能创建对象的情况。
null对象表示一个特殊值,表示该对象不存在。
例如,如果我说Person p;
。此时,java将给p赋空值。现在,如果我尝试p.getName()
,显然java将无法给我该人的名字,因为我从未创建过一个。因此,当你试图使用null变量访问某些东西时,java就会抛出一个错误。
如果您需要更好的理解,有很多关于这个主题的资源。请注意,使用默认的/占位符值,如null,是一个非常常见的概念,甚至在非面向对象语言中也会使用。
对于你上面的问题。轨道可以是空的,因为有人可以只做ArrayList<Tracks> tracks
,而不使用new
关键字初始化它。
此外,您可以执行tracks.add(null);
,它将空值存储到列表中。因此,当您执行tracks.get(i)
时,您可能会收到一个空值。
正如上面所解释的,调用get
或getPlayCount()
会导致空指针异常。
我强烈建议您阅读一些Java的介绍性材料,因为我相信这个主题将在这些材料中得到深入的讨论。