仅当字符串包含至少一个字符时才打印出字符串,这引起了混淆

Printing out a string only if it contains at least one character question confusion

提问人:rhian 提问时间:5/2/2022 最后编辑:rhian 更新时间:5/3/2022 访问量:55

问:

我卡住了这个问题:

答案是版本 3,但我不确定为什么。我尝试使用分配了 null 的测试字符串对其进行测试,这是我使用的版本 2:

String str = null;
if (str != null || !str.equals("")){
    System.out.println(str);
}

它给了我一个空指针异常,除了版本 3 之外,我真的很困惑。

Java 字符串 NullPointerException

评论

1赞 Karl Knechtel 5/2/2022
欢迎使用 Stack Overflow。“它给了我一个空指针异常,除了版本 3 之外,我真的很困惑。”那么,你知道什么是空指针异常吗?你知道如何工作吗?是否允许调用方法?如果代码在 或 的左侧有方法调用,是否会尝试该调用?知道了这些事情,试着向我证明其他版本的代码应该可以工作。(你不能,因为他们没有;但尝试应该清楚地说明他们为什么不这样做。&&||null&&||
0赞 Karl Knechtel 5/2/2022
请阅读 ericlippert.com/2014/03/05/how-to-debug-small-programs 并尝试自己讨论代码;并阅读如何提问meta.stackoverflow.com/questions/284236,并注意这不是一个讨论论坛。“我对此感到困惑”根本不是一个问题,更不用说一个适合 Stack Overflow 的问题了。
0赞 Karl Knechtel 5/2/2022
如果你不知道我第一条评论中问题的答案,你应该先复习你的教科书,或者和你的导师谈谈,或者尝试自己寻找答案,例如使用搜索引擎
0赞 hakima maarouf 5/2/2022
@jhanzaib都说了。这两个问题也可以帮助你锻炼 stackoverflow.com/questions/2263660/...... 和 stackoverflow.com/questions/21202415/......
0赞 Bohemian 5/2/2022
根据如何提问指南,请不要发布代码、数据、错误消息等的图像。相反,将文本复制或键入到您的问题中,格式为代码。保留将图像用于图表或演示渲染错误;无法通过文字准确描述的事情。

答:

1赞 Jhanzaib Humayun 5/2/2022 #1

必须检查 -statements 中的条件。因此,如果您的 -语句中有,那么您将检查并检查第一个语句是否是 .假设字符串是 .第一个条件是,第二个条件尝试检查。然后你会得到一个 NullPointerException,因为你无法与字符串进行比较。ifstr != null || !str.equals("")ifstr != null!str.equals("")falsenullfalse!str.equals("")null

但是,如果使用 ,则将首先检查,并且仅当第一个语句是 时才会检查第二个语句。这意味着,如果字符串是 .因此,您永远不会收到 NullPointerException。str != null && !str.equals("")str != null!str.equals("")true!str.equals("")null

你不能使用,因为没有等于方法。通过使用 You 检查字符串的引用。所有内容都具有相同的引用,因此,如果您的字符串是 ,那么它将指向引用,并可用于检查该引用。str.equals("")null==nullnullnull==

评论

0赞 rhian 5/2/2022
很好的解释,谢谢。只是为了确认可以针对 str != null 检查字符串,但不能针对 !str.equals(“”) 检查 null 字符串?
0赞 Gurkirat Singh Guliani 5/2/2022
".所以,如果你有 str != null ||!str.equals(“”) ,那么你将检查 str != null,然后检查 !str.equals(“”),不管第一个条件的结果如何,因为你使用的是 ||,这意味着“或”——这是错误的。(如果第一个条件为真,则不计算第二个条件)
1赞 Jhanzaib Humayun 5/2/2022
添加了对 ' !str.equals(“”)' 的解释。@Gurkirat感谢您的更正。
2赞 Gurkirat Singh Guliani 5/2/2022 #2

如果对 null String 执行任何操作,则会给出 null 指针异常。( Here you are comparing it with !str.equals(""))

另一点需要注意的是: 在 ||条件,如果第一个条件为真,则不会计算第二个条件。

而在&&中,如果第一个条件为假,则不计算第二个条件。

出于这个原因, 这两者都称为短路算子。

评论

0赞 rhian 5/2/2022
你的意思是说,无论||中第一个条件的结果如何,都会检查第二个条件就像@Jhanzaib胡马雍说的那样
0赞 Gurkirat Singh Guliani 5/2/2022
@rhian,不,我已经回复了他的评论
0赞 Gurkirat Singh Guliani 5/2/2022
图片中提到的 version2 和您键入的 version2 是相反的,if 中的条件是相反的(第一个变成第二个,反之亦然0)