String表示它不为null但后来抛出NullPointerException

时间:2009-10-07 19:26:35

标签: java string null nullpointerexception

OMG。我有一个小项目要做,而且Strings正在杀了我!

现在,我有一个null的字符串(取自从servlet调用getParameter()的值)。

问题在于,我正在尝试查看它是否为空,并且,即使它为空,在程序中告诉我不是null,但是后来在程序中,当我使用时变量,我收到一个异常,说变量是null

    System.out.println("In  " + ID); // in console: In null
    if ((ID == null) || (ID == "null") || ID.equals(null) || **ID.equals("null")**)
    {

       // after I put the 4th condition, the if is working right (WHAT IS THE PROBLEM?)            
        System.out.println("==null");
        this.ID = "";
    }
    else
    {
        System.out.println("!=null");
        this.ID = ID;
    }
    System.out.println("After " + ID);

我做错了什么?

只有第四种情况正在发挥作用!剩下的就是其他的(除了第二个,因为我说的这个条件是因为我绝望了)

我教ID == nullID.equals(null)没问题,但没有。

修改  问题在于,我从表单中获取ID的值(表格1通常说 - 通常)。但在这种情况下,我使用的表单2没有任何ID输入,因此ID必须为null而不是"null"

7 个答案:

答案 0 :(得分:10)

ID.equals("null")

显然,ID包含四个字母的字符串"null"。所以它不是null(“无”的值)。

有关null常量的更多信息,请参阅Java glossary。基本上,如果变量没有引用任何对象,则其值为null。字符串"null" 对象,但是,类String的实例,在这种情况下,变量ID引用此对象。

(请注意,按照惯例,Java变量以小写字母开头,而像ID这样的首字母缩写词写得完全小写,因此请写id而不是ID。)

答案 1 :(得分:6)

以下是您尝试过的四项测试。第一个和第四个是你应该需要的唯一的。

  • ID == null:字段'ID'null?
  • ID == "null":字段“ID”的引用与新分配的String“null”相同吗?这通常应该返回false。
  • ID.equals(null):这应该总是返回false - 从概念上说这是真的,你应该抛出NullPointerException
  • ID.equals("null")String'ID'的值是否与String“null”的值相同?

答案 2 :(得分:5)

因为从servlet获取字符串,我可以说这是正常的。

Java在某些条件下将空字符串转换为“null”字符串。

显然,您检索的字符串不是空值,但它是一个4字符串“null”

你为什么不尝试调试?或者只是看看这会带来什么:

System.out.println("Length of ID:  " + ID.Length);

编辑:如果你没有在这里得到异常,这意味着字符串不为空,并且输出“ID:4的长度”将意味着字符串真的是ID =“null”

EDIT2:好吧,似乎有些人不明白这里发生了什么,他们说在Java的某些条件下,如何将空字符串设为“null”?他们发现它是riddiculus。我更喜欢他们在java上尝试这个:

String abc = null;
String xyz = "hello"; 
System.out.println(xyz + abc); 

输出将是“hellonull”没有别的......

此外,我们还有一个servlet。有一个空数据。 Servlet将空数据发送为“null”它应该做什么?一个空字符串?来吧!!! “

答案 3 :(得分:2)

看起来它返回String“null”而不是Null对象。

答案 4 :(得分:0)

如果结果实际上是null,那么

ID == null

就足够了,但正如所提到的,ID的字符串值显然是“null”而不是null对象。

在比较字符串而不是使用==时,您应该使用.equals 这个博客解释了他的更多信息: http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

因此,在Java中,“null”不等于null。

答案 5 :(得分:0)

如果值来自Servlet,则容器很可能将空表单字段转换为空字符串。你应该检查null和空白(“”)。

if (value==null || value.equals(""))

或者,您可以使用String的isEmpty()方法:

if (value==null || value.isEmpty())

答案 6 :(得分:0)

如果你的变量ID的值是字符串文字“null”,那么我猜你在使用getParameter()方法检索它时代码中有一个bug。根据文档,如果没有指定名称的值,则getParameter()方法应返回null(空引用)。这表明你正在做一个将结果转换为字符串文字的操作,或许用空字符串(即ID +“”;)