if和if/else语句有何区别?

3

我有一个类中的这种代码:

if (reload == 0) {
    String mailSuccess = "send success mail";
} else {
    String mailOther = "send other mail";
} 

if (fileError1Exists == true) {
    String mailError1 = "send mail for error 1";
}

if (fileError2Exists == true ) {
    String mailError2 = "send mail for error 2";
}

if (fileError3Exists == true ) {
    String mailError3 = "send mail for error 3";
}

也许因为我对Java的经验还不够丰富,我想知道这种语法是否简洁?每次看到一个“if/else”表达式时,它更像是这样:

if (condition == 0) {
    String mailSuccess = "send success mail";
} else if (fileError1Exists == true) {
    String mailError1 = "send mail for error 1";
} else if (fileError2Exists == true) {
    String mailError2 = "send mail for error 1";
} else if (fileError3Exists == true) {
    String mailError3 = "send mail for error 1";
} else {
    String mailOther = "send other mail";
} 

保持这些if语句像这样一个接一个地干净吗?显然,第一段代码的工作是有效的,因为它已经在生产中。但是第一段和第二段代码是否做了同样的事情?通常情况下,是的,对吗?还是因为我的经验不足而错过了什么?
感谢您提前的反馈。我找不到以前的帖子上的答案。
编辑感谢你们所有人的回答。它帮助我理解代码,而且更重要的是,它帮助我学到了新东西!

4
为了帮助你将来的工作,这与语法无关。 - Federico klez Culloca
5
请注意:这两个片段不等同。因此,如果您需要的是第一个描述的行为,使用第二个片段是不正确的。此外,您可以避免所有那些“== true”,它们是不必要的。 - BackSlash
3个回答

3
这是一个具体要求的问题。第一段代码将会对每个错误发送一封电子邮件,也就是说,如果发现了 3 个错误,它将会发送 3 封电子邮件。
你的第二段代码将会只对找到的第一个错误发送一封电子邮件,而不是其他的错误。
如果你想要每个错误都有一封电子邮件,那么请采用第一段代码。否则,如果你只需要在第一次出现错误时收到一封电子邮件,请使用第二段代码。
编辑: 为了考虑 @Lino 的建议,你可以这样做:
if (reload == 0) {
    String mailSuccess = "send success mail";
} else {
    String mailOther = "send other mail";
}

StringBuilder mailErrors = new StringBuilder();

if (fileError1Exists) {
    mailErrors.append("error 1 occurred");
}

if (fileError2Exists) {
    mailErrors.append("error 2 occurred");
}

if (fileError3Exists) {
    mailErrors.append("error 3 occurred");
}

String mailErrorText = mailErrors.toString();

跟踪错误并发送一封包含所有发生错误信息的电子邮件。

在我看来,跟踪每个错误是最佳实践。


2
第二种情况也可以写成一个 switch 语句。 - XtremeBaumer
2
最好的方法可能是中庸之道,跟踪每个错误但只发送一封电子邮件。 - Lino
2
你可能只需要这样写:if (fileError1Exists) { 即移除 == true - achAmháin
1
@notyou 你的意思是“你应该这样做”。 - Michael

3

ifif-then-else 都是条件语句,但它们的行为不同。

使用多个独立的 if 时,JVM 可能会执行条件语句中包含的每个语句,而使用一组 ifif-then-else 中时,JVM 将始终执行包含的一个语句。

通常情况下,当包含的条件语句的处理是累加的时,应使用一组独立的 if ,而当包含的条件语句的处理是排他的时,应使用 if-then-else

这种行为在 JLS 中有明确规定。

14.9.1. if-then 语句

...

否则,根据结果值做出选择:

如果结果值为 true,则执行包含的语句;......

如果结果值为 false,则不采取进一步操作,if-then 语句正常完成。

以及:

14.9.2. if-then-else 语句

首先通过计算表达式来执行 if-then-else 语句。如果结果是布尔类型,则需要进行拆箱转换(§5.1.8)。

...

否则,根据结果值做出选择:

如果结果值为 true,则执行第一个包含的语句(即 else 关键字之前的语句);仅当该语句的执行正常完成时,if-then-else 语句才会正常完成。

如果结果值为 false,则执行第二个包含的语句(即 else 关键字之后的语句);......


1

deHaar描述了两个版本语义(含义)的变化,并提供了改进意见。 davidxxx介绍了if语句的正式JLS定义。 我认为还需要一个小示例,以便您可以运行并清楚地看到区别。

if (value1) {
  System.out.println("Entry 1");
} else {
  System.out.println("Entry 2");
}

if (value3) {
  System.out.println("Entry 3");
}

根据value1value3的值,会得到不同的输出结果。
  • value1 = truevalue3 = true 时,输出 Entry1Entry3
  • value1 = truevalue3 = false 时,输出 Entry1
  • value1 = falsevalue3 = true 时,输出 Entry2Entry3
  • value1 = falsevalue3 = false 时,输出 Entry2

现在更改后的程序如下:

if (value1) {
  System.out.println("Entry 1");
} else if (value3) {
  System.out.println("Entry 3");
} else {
  System.out.println("Entry 2");
}

根据value1value3的值,会得到不同的输出结果。
  • value1 = true并且value3 = true,将打印Entry1
  • value1 = true并且value3 = false,将打印Entry1
  • value1 = false并且value3 = true,将打印Entry3
  • value1 = false并且value3 = false,将打印Entry2
注意当value3 = true时,输出结果如何改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接