0

如果newWordnull,它不应该进入循环,但为什么它进入循环并给出java.lang.NullPointerException

newWord = "abcd";
while(!newWord.equals(null))
{
    try {
    newWord = br.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    }
    catch(NullPointerException p)
    {

    }
}

它提供了堆栈跟踪,但我没有在任何地方使用printStackTrace()

4

8 回答 8

8

newWord本身为空。当一个对象为空时,你不能在它上面调用任何方法,因为这个对象没有被定义。作为.equals一种方法,您会遇到异常。试试这个:

newWord != null

这是调试器很容易解决的问题。学习使用调试器是令人沮丧的(就像学习任何新工具一样),但它会为你省去很多时间的痛苦。这是你的朋友。

于 2013-07-30T13:05:24.627 回答
3

简单地说怎么样

    while(newWord!=null)

想一想,如果 newWorld 为 null,当你调用它的方法时会发生什么?

于 2013-07-30T13:05:16.587 回答
1

它不会进入循环,因为

newWOrd.equals(null)

如果为空,将抛出 NPE

你的意思是

newWord != null

如果您使用调试器,您可以看到此行为,或者查看堆栈跟踪中触发它的行。

于 2013-07-30T13:05:48.367 回答
0
!newWord.equals(null)

是你的问题。

采用newWord != null

于 2013-07-30T13:05:41.513 回答
0

您只检查“newWord”是否为空,而不会检查“br”是否还有任何内容。

就像是:

而(br.hasNext());

于 2013-07-30T13:07:19.877 回答
0

你得到的 NullPointerException 是因为while(!newWord.equals(null))它没有被捕获,因为在这段代码之后使用了 try , catch 。

如果你想抑制这个异常,然后把它while(!newWord.equals(null))放在 try-catch 块中。

于 2013-07-30T13:11:34.627 回答
0

String.equal 的参数不应为 null 并且显式传递了 null ,因此异常也是如此。使用复合表达式检查空字符串和特殊空值。

它试图在进入循环之前评估表达式,很快就遇到了表达式!newWord.equals(null),因为为newWord空,所以抛出了异常。

于 2013-07-30T13:16:15.787 回答
0

为避免在大多数情况下出现 null 异常(在条件表达式中),我建议您使用 Yoda 条件:

if(null != value)

此外,这适用于变量和常量之间的每个条件:

if(MY_CONSTANT_STRING.equals(myVariableString))
于 2017-04-28T22:23:30.877 回答