if/else(Java)的奇怪行为

if/else(Java)的奇怪行为,java,Java,我有一段Java代码,它有一个简单的if-else块,如下所示 if (null != field1 && null != field2 && field1.equals(field2)) { validated = true; } else if (null == field1 && null == field2) { validated = true; } e

我有一段Java代码,它有一个简单的if-else块,如下所示

    if (null != field1 && null != field2 && field1.equals(field2)) 
    {
            validated = true;

    } else if (null == field1 && null == field2) {
            validated = true;

    } else if ((field1 == null && field2.length() == 0) 
            || (field2 == null && field1.length() == 0)) {      
           validated = true;

    } else if (null != field1 && null != field2 && !field1.equals(field2)) {
            validated = false;
            return validated;
    }
奇异性:当field1和field2获得如下值时

field1 = ""
field2 = null 
使用此组合,这将命中第三个if块,并且应将validated设置为true。相反,执行和验证的最后一个if块被设置为false


你知道这里出了什么问题吗?

你为什么只在第四个街区回来:

} else if (null != field1 && null != field2 && !field1.equals(field2)) {
    validated = false;
    return validated;
}
如果field1和field2设置为这样,则会出现其他错误,它只会到达第三个块。我复制并粘贴了你的代码,只是删除了返回。这将返回您预期的验证结果:

    String field1 = "";
    String field2 = null;
    boolean validated = false;
    if (null != field1 && null != field2 && field1.equals(field2)) {
            validated = true;
    } else if (null == field1 && null == field2) {
            validated = true;
    } else if ((field1 == null && field2.length() == 0) 
            || (field2 == null && field1.length() == 0)) {      
           validated = true;

    } else if (null != field1 && null != field2 && !field1.equals(field2)) {
            validated = false;
    }
    System.out.println(validated);

根据您的一条评论,我相信null是一种字符串类型,只要XML标记为空,就可以将它注入
XML
文件中。因此,当您想将您的字段与字符串类型的null进行比较时,您使用的
=
是完全错误的

您的评论:

@KickButtowski实际上我正在使用xtreme解析XML并填充 POJO对象。只要XML中的值标记为空,它就会 将null插入POJO对象内的相应值字段- 用户1356042

您必须使用
equals()
而不是
=

为什么?

equals()
compare againt用于比较您要查找的内容

=
如果引用正在查看同一位置,则比较引用

例如:

} else if (null == field1 && null == field2) {


field2
是字符串
“null”
?请修复第二个代码片段,它不清楚。它来自哪里?是Java代码吗?是来自文本文件吗?修复了代码片段。很抱歉输入了不相关的内容,但是我的
foo==null
v会更加一致
null==foo
用法,否则它意味着有理由采取不同的做法。而且,这有点难读。我可能会使用早期返回。@user1356042为什么不也使用equals()检查空值?
null。equals(field1)
没有多大意义。如果
field1
为空,则
null==field1
可以。你的意思是
“null”。等于(field1)
?是的,我已经意识到了,我想问op更多的问题:)
} else if ("null".equals(field1) && "null".equals(field2)) {