if vs. if / else语句?

时间:2018-07-03 09:49:56

标签: java if-statement

我在课堂上有这样的代码:

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 / ese”表达式,它更像是这样:

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语句像这样干净?显然,第一个代码示例可以工作,因为它已经在生产中。但是第一示例代码和第二示例代码是否做相同的事情?通常情况下,对吗?还是因为缺乏经验而错过了什么?

在此先感谢您的反馈。在以前的帖子中找不到我的遮阳篷。

edit 谢谢大家的帮助。它帮助我理解了代码,而且还帮助我学习了一些新知识!

3 个答案:

答案 0 :(得分: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();

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

IMHO跟踪每个错误是最佳实践。

答案 1 :(得分:3)

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

使用多个分开的if,JVM可以对条件语句中的每个包含的语句执行0,而在if中使用一组if-then-else时,JVM将始终执行01包含的语句。

根据经验,您将使用一组单独的if,因为所包含的条件语句中的处理是累加的,而您将使用if-then-else作为以下条件中的处理所包含的条件语句为排他性

该行为在JLS中指定。

  

14.9.1. The if-then Statement

     

...

     

否则,将根据   结果值:

     

如果该值为true,则执行所包含的Statement;否则为false。 ...

     

如果该值为false,则不执行进一步的操作,如果为-then   语句正常完成。

然后:

  

14.9.2. The if-then-else Statement

     

首先执行以下操作来执行if-then-else语句   表达。如果结果为布尔类型,则受制于   取消装箱转换(第5.1.8节)。

     

...

     

否则,将根据   结果值:

     

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

     

如果该值为false,则包含的第二个Statement(一个   在else关键字之后); ...

答案 2 :(得分:1)

deHaar描述了两个版本的语义(含义)的变化并提供了改进。 davidxxx提供$link= mysqli_connect("localhost","root","","example"); if (mysqli_connect_error()) { echo "error"; } $rows=array(); $page_size=4000; $total_records=100000; $count=ceil($total_records/$page_size); for($i=0; $i<=$count; $i++) { $offset_var = $i * $page_size; $query = "select id from shipment Limit ".$page_size." OFFSET ".$offset_var; $result= mysqli_query($link, $query); while ($row = mysqli_fetch_assoc($result)) { $rows[]= $row; } } mysqli_close($connection); echo "<pre>";print_r($rows);echo "</pre>"; 语句的正式JLS定义。 我相信仍然需要一个小的示例,您可以运行它来清楚地看到差异。

if

根据if (value1) { System.out.println("Entry 1"); } else { System.out.println("Entry 2"); } if (value3) { System.out.println("Entry 3"); } value1的值,您将获得不同的输出。

  • value3value1 = true打印value3 = trueEntry1
  • Entry3value1 = true打印value3 = false
  • Entry1value1 = false打印value3 = trueEntry2
  • Entry3value1 = false打印value3 = false

现在更改的程序如下:

Entry2

根据if (value1) { System.out.println("Entry 1"); } else if (value3) { System.out.println("Entry 3"); } else { System.out.println("Entry 2"); } value1的值,您将获得不同的输出。

  • value3value1 = true打印value3 = true
  • Entry1value1 = true打印value3 = false
  • Entry1value1 = false打印value3 = true
  • Entry3value1 = false打印value3 = false

注意Entry2时输出如何变化。