在我的代码中,我有一行生成空指针异常
if (x[i].getPos() == "QB") {
playerTextBox.setText(playerTextBox.getText() + "\n" + f.printPlayer(x, i));
}
我几乎是肯定的,null不是数组x。我进行了调试,并且有一些对象填充了阵列。我现在只是很好奇,我想如果x为null,你会得到一个空指针异常
(x[i].getPos() == "QB")
?
答案 0 :(得分:5)
好吧,x[i]
是null
,否则就不会有任何异常。此外,您应该使用String
而不是equals
来比较==
。
您的if
应如下所示:
if (x[i] != null && "QB".equals(x[i].getPos()) {
//...
}
顺便说一句,我建议您使用List<Yourclass>
而不是数组。请注意,默认情况下,数组填充null
值。
答案 1 :(得分:2)
是
if (x[i].getPos() == "QB")
如果x[i]
为空,将生成空指针异常。您无法在null
上调用方法。此外,您正在测试String
引用相等(而不是值相等)。
if (x[i] != null && x[i].getPos() != null && x[i].getPos().equals("QB"))
答案 2 :(得分:0)
答案是肯定的。
如果x为null,那么x的位置将导致异常(如果您尝试获取它)。
所以x[i].getPos()
会导致空指针异常。
答案 3 :(得分:0)
是的,他们可以。
如果x [i]为null, x[i].getPos()
将抛出nullpointerexception。
如果你不确定它不能为空,那么每当你点到某些东西时你应该检查null。短路评估是实现这一目标的常用方法。
if (x[i] != null && x[i].getPos() == "QB") playerTextBox.setText(playerTextBox.getText() + "\n" + f.printPlayer(x, i));
如果x[i]
为null,那将悄悄地传递此代码。但是,你说你确信x[i]
不是空的。因为你已经将if的主体放在同一行上,所以异常的行号不会给你任何关于哪个点引起nullpointerexception的提示。
如果playerTextBox
或f
为空,则它们也会产生nullpointerexceptions。您必须决定是否希望此代码在它们为空时安静地失败,抛出异常以在其他地方处理,或以某种方式确保它们不能保留为空。
如果我假设您希望在它们为null时抛出invalidargumentexception
,我会像这样重写代码:
if (playerTextBox == null) {
throw new IllegalArgumentException("playerTextBox was null");
}
if (f == null) {
throw new IllegalArgumentException("f was null");
}
if (x == null) {
throw new IllegalArgumentException("x was null");
}
if ( x[i] != null && "QB".equals( x[i].getPos() ) ) {
playerTextBox.setText(playerTextBox.getText() + "\n" + f.printPlayer(x, i));
}
如果您确信其中任何一个都不能为null,则可以删除测试为null。 IllegalArgumentException适用于传入变量的上下文,因此需要验证其状态。如果你不打算在这个方法中解决这个问题,但你不想悄悄地做任何事情,那么正确的做法就是抛出一个异常,即调用堆栈中的某些东西必须决定如何从中恢复。如果您有一种计划从IllegalArgumentExceptions恢复的方式,那么能够将所有这些异常发送到一个地方就可以解决了。