【问题标题】:String says its not null but then later throw NullPointerException字符串说它不为空,但后来抛出 NullPointerException
【发布时间】:2010-12-04 18:08:04
【问题描述】:

天哪。我有一个小项目要做,弦乐要了我的命!

现在,我有一个字符串,它是 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"

【问题讨论】:

    标签: java string null nullpointerexception


    【解决方案1】:
    ID.equals("null")
    

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

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

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

    【讨论】:

      【解决方案2】:

      这是您尝试过的四个测试。第一个和第四个是您唯一需要的。

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

      【讨论】:

        【解决方案3】:

        既然你从一个 servlet 得到字符串,我可以说这是正常的。

        Java 在某些情况下将空字符串转换为“空”字符串。

        很明显你检索到的字符串不是空值,而是4个字符的字符串“null”

        为什么不试试调试呢?或者看看这会返回什么:

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

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

        EDIT2:好吧,似乎有些人不明白这里发生了什么,他们说在 Java 中的某些条件下,空字符串如何为“空”?他们觉得这很可笑。我更喜欢他们在 java 上试试这个:

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

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

        这里我们还有一个 servlet。有一个空数据。 Servlet 将 null 数据作为“null”发送它应该做什么?一个空字符串?快点!!! "

        【讨论】:

        • 是的,你说得对,id 变量包含“null”。附: 1. 感谢大家告诉不要使用“==”并且该变量包含“null”。
        【解决方案4】:

        看起来它返回的是字符串“null”而不是 Null 对象。

        【讨论】:

        • 你的意思是一个空的reference,它是一个不引用any对象的值。
        • 问题在于,我从一个表单中获取了 ID 的值(假设是 form 1)。但在这种情况下,我使用的是没有任何 ID 输入的 form 2
        【解决方案5】:

        如果结果实际上是 null 则

        ID == null
        

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          您也可以使用 String 的 isEmpty() 方法:

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

          【讨论】:

            【解决方案7】:

            如果您的变量 ID 的值是字符串文字“null”,那么我猜想当您使用 getParameter() 方法检索代码时,代码中早先存在错误。根据文档,如果指定名称没有值,则 getParameter() 方法应该返回 null (空引用)。这表明您正在某处执行将结果转换为字符串文字的操作,可能与空字符串连接(即 ID + "" ; )

            【讨论】:

              猜你喜欢
              • 2023-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-20
              • 1970-01-01
              • 1970-01-01
              • 2016-02-14
              相关资源
              最近更新 更多