Java中的空指针异常

时间:2014-03-28 17:08:35

标签: java nullpointerexception null initialization

据我所知,尝试将某个对象的值与某些东西进行比较会导致NullPointerException,例如,

String bob;
if(bob.equals("blahblahblah")){do_something();}

并且使用嵌套检查是个好主意:

if(!bob.equals(null)){
    if bob.equals("blah blah blah"){
      do_something();
    }
}

但是如果我还没有给出任何值,那么当我运行上述说法bob还没有被初始化时,我会收到错误 - 因为我将bob与null进行比较,我应该是能够毫无问题地运行它,不应该吗?

感谢。

6 个答案:

答案 0 :(得分:3)

如果bob为null,则无法执行bob.equals - 您需要检查

if (bob != null)
像这样

if (bob != null) {
    if (bob.equals("blah blah blah")){

          do_something();
    }
}

解决问题的好方法是

if ("blah blah blah".equals(bob)) {

}

答案 1 :(得分:2)

!bob.equals(null)

您正在尝试在null对象上调用方法,因此您将收到错误。试试这个:

bob != null

答案 2 :(得分:2)

想象一下写作

null.equals(null)

您希望它有效吗?出于同样的原因,这不起作用。如其他所述,您可以使用引用比较(==),因为只有1个空。

答案 3 :(得分:1)

您的bobnull,您无法致电equal(),无论是将您的计划更改为

if(bob != null){
    if bob.equals("blah blah blah"){
      do_something();
    }
}

OR

初始化bob,如String bob = new String("some string");

答案 4 :(得分:1)

正如Shreyos指出的那样,你永远不会初始化bob所以你得到了NPE。您可以使用Yoda Conditions

来防止这种情况发生

if("blahblahblah".equals(bob)){do_something();}

您的字符串文字永远不能为空,因此当equals()实际上为空时,false比较将返回bob。许多人对使用这种技术嗤之以鼻,但在许多情况下它们都很方便。

答案 5 :(得分:0)

你的问题是:

if(!bob.equals(null)){
    if bob.equals("blah blah blah"){
      do_something();
    }
}

假设您使用String bob;声明了这一点。编译器会将其默认为String bob = null;

null是一个指针(引用)本身。方法String.equals()是String类中引用的方法。由于您没有创建类型为String的对象,因此该类不存在,因此该方法也不存在。

如果您要测试某些内容是否为null(就像您最终编写生产代码时那样),那么您将使用这样的equals运算符:

if( null != bob ){ //operations on bob }

额外细节:

现在初始化是这样的,当你说出类似的东西时:

String bob = "foo";

编译器实际上会编写类似String bob = new String(foo);

的内容

这应该告诉你,初始化意味着对象的创建。

我说“类似”,因为以下内容也是可能的:

String bob = "foo" + "bar";

编译器将编写

String bob = new StringBuilder("foo").append("bar").toString();