Java 如果(String!=null)仍然通过?
有时,或者通常,我需要查看字符串是否为null,因此我使用如下条件:Java 如果(String!=null)仍然通过?,java,string,if-statement,null,Java,String,If Statement,Null,有时,或者通常,我需要查看字符串是否为null,因此我使用如下条件: if(str != null) { } 直到今天,它还工作得很好,现在即使是空字符串也会因为某种原因而通过,我不明白。有人知道解释吗?还是一个解决方案 编辑: 由于某种原因,字符串似乎不为null,这很奇怪,因为我从未定义它是什么,只是定义它存在。因此,该字符串是一个单词“null”的字符串。我完全不知道为什么会这样?当我做以下事情时: String str; 那么它会自动为空,对吗?如果不是,为什么会变成字符串“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的代码中是否是一个有效的加法。我理解您的推理(我在很快开始工作之前也回答了),所以尽管我没有否决投票,我为你的答案投了一张赞成票(因为它是经过编辑的!)我已经查看并调试过了,在两者中都设置了打印,但当字符串为空时,它仍然通过