if语句可以触发空异常吗?

时间:2014-12-09 20:57:02

标签: java nullpointerexception

在我的代码中,我有一行生成空指针异常

 if (x[i].getPos() == "QB") {
     playerTextBox.setText(playerTextBox.getText() + "\n" + f.printPlayer(x, i));
 } 

我几乎是肯定的,null不是数组x。我进行了调试,并且有一些对象填充了阵列。我现在只是很好奇,我想如果x为null,你会得到一个空指针异常  (x[i].getPos() == "QB")

4 个答案:

答案 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的提示。

如果playerTextBoxf为空,则它们也会产生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恢复的方式,那么能够将所有这些异常发送到一个地方就可以解决了。