Menu

Java if-else:条件语句详解与示例

如何在 Java 中用 if、else if 和 else 做判断:布尔条件、多分支链、嵌套、三元运算符,以及让人栽跟头的常见错误。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

用 if 做判断

程序需要根据数据做出反应:及格还是不及格,有货还是售罄,有效还是无效。if 语句就是 Java 根据条件选择运行哪段代码的方式。

if 在括号里接收一个布尔条件,只有当条件为 true 时,才运行花括号里的代码块:

条件 score >= 60 为 true,所以消息被打印出来。右花括号后面的那一行总会运行,因为它在 if 之外。把 score 改成 40,“passed”那一行就会被整个跳过。

与 C 不同,Java 不允许你在需要布尔值的地方放一个数字。if (score) 是编译错误:条件必须是一个真正的 boolean 表达式,由比较(>、>=、==、!=)或布尔逻辑(&&、||、!)构成。

加上 else

else 提供了“否则”的路径,也就是只在条件为 false 时运行的代码:

两个代码块中恰好有一个会运行:不会两个都运行,也不会一个都不运行。else 没有自己的条件,它只是接住 if 没有接住的所有情况。

用 else if 串联

当结果不止两种时,用 else if 把条件串起来。Java 从上往下逐个检查,运行第一个条件为 true 的代码块,然后跳过其余部分:

顺序很重要。84 先和 >= 90 比较(false),再和 >= 80 比较(true),于是停在 B,根本不会去检查更低的分数线。这也是为什么你不需要写 score >= 80 && score < 90:能走到第二个分支,就已经保证 score 低于 90。把范围最窄或优先级最高的条件放在最前面。

最后的 else 是兜底分支。在这里省略它会导致编译错误,因为打印 grade 时它可能还没有被赋值。

比较值:== 与 equals()

Java 中最常见的 if 语句 bug,就是用 == 比较字符串。对于基本类型(int、double、char、boolean),== 是正确的。对于对象,== 问的是“这是内存中的同一个对象吗?”,而 .equals() 问的是“它们的内容一样吗?”,你几乎总是想要后者:

只有第二条消息会打印出来。new String("yes") 和字面量 "yes" 是不同的对象,所以 == 为 false,但文本完全相同,所以 .equals() 为 true。经验法则:基本类型用 ==,对象用 .equals()。

当变量可能为 null 时,有个避免 NullPointerException 的安全技巧:把字面量放在前面,写成 if ("yes".equals(input)),因为字面量永远不会是 null。

组合与嵌套条件

你可以用 &&(与)、||(或)和 !(非)组合条件;当某个检查只有在前一个检查通过后才有意义时,也可以把一个 if 嵌套在另一个里面:

&& 和 || 会短路:在 a && b 中,如果 a 为 false,Java 根本不会求值 b。这在防止出错时很方便:if (s != null && s.length() > 0) 是安全的,因为 s 为 null 时长度检查会被跳过。能用 && 组合时,尽量别深层嵌套;扁平的代码比一座花括号金字塔更好读。

一个经典陷阱:单个 = 是赋值,== 才是比较。对 int 写 if (x = 5) 会编译错误(这是好事),但对 boolean 写 if (flag = true) 能通过编译,并且悄悄地完成了赋值,要特别留意。

三元运算符

如果你只想在两个值之间二选一,三元运算符 ?: 是一种紧凑的单行写法。condition ? a : b 读作“如果 condition 成立就是 a,否则就是 b”:

三元运算符会产生一个值,你可以直接把它赋给变量或作为参数传递。只在简单的取值选择时使用它;如果任何一个分支需要多条语句或真正的逻辑,完整的 if-else 会更易读,而嵌套的三元运算符很快就会变成一道谜题。

一个陷阱:省略花括号

当分支只有一条语句时,Java 允许你省略花括号,但这会招来一个不易察觉的 bug。缩进会骗人:

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

只有第一行受 if 控制;第二行总会运行,尽管缩进让人以为不是这样。始终使用花括号,哪怕只有一行,这一类错误就会彻底消失。

下一篇:switch

当每个分支检查的条件各不相同时,if-else if 链非常合适。但当你要把一个值和许多固定的可能性逐一比较时,比如星期名称、菜单选项或枚举,长长的 else if 阶梯就会变得重复。switch 语句正是为此而生,这就是下一篇的内容。

常见问题

Java 中如何写 if-else 语句?

在 if 后面的括号里写一个布尔条件,再在花括号里写要运行的代码,还可以加一个可选的 else 块,在条件为 false 时运行:if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }。条件必须求值为 boolean,Java 不像 C 那样接受 int。

Java 的 if 语句中 == 和 equals() 有什么区别?

== 比较两个引用是否指向同一个对象,而 .equals() 比较的是内容。对于 int 这样的基本类型,用 ==。对于对象,尤其是 String,要用 .equals():写 if (name.equals("Sam")),而不是 if (name == "Sam")。用 == 比较字符串是 Java 中最常见的 if 语句 bug。

Java 中的三元运算符是什么?

三元运算符 condition ? valueIfTrue : valueIfFalse 是一种会产生值的紧凑版 if-else。例如 String label = age >= 18 ? "adult" : "minor"; 会根据条件赋予两个值中的一个。它适合简单的取值选择;如果每个分支里都有逻辑要执行,就用完整的 if-else。

Coddy 编程语言插图

和 Coddy 一起学编程

开始