Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果(String!=null)仍然通过?_Java_String_If Statement_Null - Fatal编程技术网

Java 如果(String!=null)仍然通过?

Java 如果(String!=null)仍然通过?,java,string,if-statement,null,Java,String,If Statement,Null,有时,或者通常,我需要查看字符串是否为null,因此我使用如下条件: if(str != null) { } 直到今天,它还工作得很好,现在即使是空字符串也会因为某种原因而通过,我不明白。有人知道解释吗?还是一个解决方案 编辑: 由于某种原因,字符串似乎不为null,这很奇怪,因为我从未定义它是什么,只是定义它存在。因此,该字符串是一个单词“null”的字符串。我完全不知道为什么会这样?当我做以下事情时: String str; 那么它会自动为空,对吗?如果不是,为什么会变成字符串“null

有时,或者通常,我需要查看字符串是否为null,因此我使用如下条件:

if(str != null) {
}
直到今天,它还工作得很好,现在即使是空字符串也会因为某种原因而通过,我不明白。有人知道解释吗?还是一个解决方案

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

String str;

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

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

或者,
str
是否是其他线程正在修改的非局部变量


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

在检查null之后,我还会检查长度:

if(stringVar == null || stringVar.length() == 0) { /* DO STUFF */ }
为了使生活更轻松,您可以使用扩展方法:

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

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

当if语句明显为false时,执行if语句最常见的方式是在末尾意外地加上分号。像这样

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

我建议您仔细查看您的if语句,并根据需要在if和else子句中添加println。我向您保证,当str为null时,if(str!=null)肯定不会运行

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

if(str != null && !str.trim().isEmpty()) {
}
编辑:很抱歉在我赶去上班之前,误读并提交了一个快速解决方案

可能是由于不同的编程语言或库如何解释“null”,所以null检查失败。以下是一些有趣的链接,并进行了很好的讨论:

(一)

(二)


3) 很抱歉,我有一次因为一个“;”而陷入了类似的境地(分号)潜入if条件行末尾的。这让我非常疯狂,因为无论我如何更改条件,下面的代码块始终会执行……我在一个小时后发现了问题,当时我将代码块复制并粘贴到文本编辑器中

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

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”)

如果不是,为什么会变成字符串“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);
        }
    }
}

你介意用CTRL+A,CTRL+C将你的源代码片段发布在这里吗?发布完整的源代码或错误的堆栈跟踪。检查条件
str.length()too@aviad我相信如果我发布完整的源代码,人们会大惊小怪的。我给了你所有需要的信息,字符串是空的,但仍然传递。。。为什么?@Wiggyboy-你说的简直是不可能的。如果你发布代码,我们可以找出你为什么认为发生了不可能的事情。我们不需要完整的源代码。只是相关部分;i、 e.
if
中您认为表示
str
null
的语句。。。和相关异常跟踪(如果相关)。
stringVal.Length
?这不是C#。我的str字符串来自另一个类,并被另一个类修改,但它与str所在的调用if函数的类相同。如果这回答了你的问题question@Wiggyboy:不是真的-在您测试时,仍然不清楚
str
是否实际上是一个局部变量。我们无法确定这在OP的代码中是否是一个有效的加法。我理解您的推理(我在很快开始工作之前也回答了),所以尽管我没有否决投票,我为你的答案投了一张赞成票(因为它是经过编辑的!)我已经查看并调试过了,在两者中都设置了打印,但当字符串为空时,它仍然通过