【问题标题】:if(String != null) still passes?if(String != null) 仍然通过?
【发布时间】:2012-02-11 05:10:06
【问题描述】:

有时,或者好吧,我经常需要查看一个字符串是否为空,所以我使用这样的条件:

if(str != null) {
}

直到今天它都工作得很好,现在即使是空字符串也因为某种我不明白的原因通过了。有谁知道解释吗?还是解决方案?

编辑: 好的,所以由于某种原因,字符串似乎不是空的,这很奇怪,因为我从未定义它是什么,只是定义它存在。因此,该字符串是单词“null”的字符串。我完全不知道为什么会这样?当我执行以下操作时:

String str;

那么它会自动为空,对吗?不管怎样,如果不是,为什么它会变成字符串“null”?

【问题讨论】:

  • 您介意 CTRL+A,CTRL+C 您的源代码片段并在此处发布吗?
  • 发布错误的完整源代码或堆栈跟踪。
  • 也检查条件str.length();
  • @aviad 好吧,我相信如果我发布我的完整源代码,人们会很在乎。我给了你所有的信息,字符串为空,但仍然通过......为什么?
  • @Wiggyboy - 你所说的实际上是不可能的。如果您发布代码,我们可以弄清楚您为什么认为发生了不可能的事情。我们不需要完整的源代码。只是相关部分;即您认为if 中的语句意味着strnull ...以及相关的异常跟踪(如果相关)。

标签: java string if-statement null


【解决方案1】:

解释是您的诊断不正确。如果str 为空,则if 语句的主体不会被执行——就这么简单。您还没有说明您是如何诊断出 str is null 的,但该代码仍在执行中 - 如果是因为您看到的是 NullPointerException,那么您有多种原因可能仍然会得到那个。特别是,这很可能是由于nullif 块中时取消引用了一个不同 表达式。

或者,str 是否是一个被其他线程修改的非局部变量?

编辑:请注意,我一直假设您知道 null 和对空字符串的引用之间的区别 - 您真的在谈论 str 的值为 null,对吗?如果你说的是空字符串,那就另当别论了。

【讨论】:

  • 我的 str 字符串来自另一个类,并被另一个类修改,但它与调用 if 函数的类是同一个类,因为 str 所在的位置。如果那回答了你的问题
  • @Wiggyboy:不是真的 - 在您测试时,str 是否实际上是一个局部变量仍然不清楚。
【解决方案2】:

在检查 null 后我也会检查长度:

if(stringVar == null || stringVar.length() == 0) { /* DO STUFF */ }

为了让生活更轻松,您可以创建一个扩展方法:

public static boolean notEmpty(String s) 
{ 
return (s != null && s.length() > 0);
}

【讨论】:

  • stringVal.Length?这不是 C#。
【解决方案3】:

基于您的 null 是小写,我假设您使用的是 java 或 C#。

当 if 语句明显为假时执行的最经典的方法是你不小心在末尾放了一个分号。像这样

if (false);
{
    System.out.println("How can this be happening!?");
}

我建议您仔细查看您的 if 语句,并在必要时将 printlns 放在 if 和 else 子句中。我向你保证,如果 (str != null) 在 str 为空时肯定不会运行。

【讨论】:

  • 我已经查看并调试了它,在两者中都设置了打印,但是当字符串为空时它仍然通过
【解决方案4】:

一个可能的原因是在多行条件块中完全省略了花括号:

if(str != null)
    callSomeMethod();
    System.out.println("length=" + str.length());

在这个优雅(和经典)的示例中,System.out.println 将始终被执行,因为它相当于:

if(str != null) {
    callSomeMethod();
}
System.out.println("length=" + str.length());

--

刚刚想到另一个可能的陷阱:

if(str != null) {
    System.out.println("str=" + str);
}

如果打印出来:

str=null

那么 str 的值可能是“null”(四个字符的单词“null”)。

【讨论】:

    【解决方案5】:

    如果不是,为什么它会变成字符串“null”?

    如果您遇到值为“null”(4 个字符的单词,而不是 null 引用)的字符串,那么您或某人已将该字符串设置为“n”-“u”-“l”-“l ”。有可能你是无意的。如果你是这个意思:

    str = null
    

    您可能输入了以下内容:

    str = "null"
    

    编译并运行这个测试程序,然后去掉str = "null" 行中的引号。再次编译并运行 - 你会看到不同的行为。

    public class shortfile {
        public static void main(String[] argv) {
            String str;
            str = "null";
            if (str == null) {
                System.out.println("str is really a null reference");
            }
            else {
                int len = str.length();
                System.out.println("We set str to the literal word null");
                System.out.println("str's length is " + len);
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      抱歉跑题了,但我记得有一次我因为';'而陷入类似的情况(分号)潜入 if 条件行的末尾。这让我非常抓狂,因为无论我如何更改条件,以下代码块总是会执行......我在一个小时后将代码块复制并粘贴到文本编辑器中时发现了问题。

      【讨论】:

        【解决方案7】:

        这可能是因为空字符串或带有空白字符的字符串。使用以下代码:

        if(str != null && !str.trim().isEmpty()) {
        }
        

        编辑:抱歉误读并提交了快速解决方案,在我赶忙上班之前。

        可能由于不同的编程语言或库如何解释“null”而导致 null 检查失败。以下是一些有趣的讨论链接:

        1) Stackoverflow - What is null in Java?

        2) Stackoverflow - Where is null in memory?

        3)Stackoverlfow - Null \u0000 in Java String?

        【讨论】:

        • 我们无法确定这是否是 OP 代码上下文中的有效添加。
        • 我理解你的推理(我在开始工作之前也回复了很快)所以虽然我没有投反对票,但我为你的答案投了赞成票(因为它已被编辑!)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 2019-05-06
        相关资源
        最近更新 更多