讲解
条件分支让程序「看情况办事」。最基本的形式是 if (条件) { ... },条件为 true 才执行花括号里的代码;加上 else 处理「否则」的情况;多路判断用 else if 链从上往下逐个检查,命中第一个为真的分支就执行,后面的全部跳过。花括号在只有一条语句时语法上可以省略,但强烈建议永远写上——省略花括号是无数线上事故的源头。
判断条件必须是 boolean 值,这是 Java 比 C/JavaScript 严格的地方:if (age) 这种「非零即真」的写法在 Java 里编译不过。多条件组合用上一章的 &&、||,注意短路顺序。嵌套 if 不要超过两三层,层次太深说明该用「提前返回」或拆分方法重构了。
当判断基于「同一个变量的若干枚举值」时,switch 比 else if 链更清晰。传统 switch 用 case 加 break,漏写 break 会「穿透」到下一个 case 继续执行,是经典陷阱。JDK 14 起新增了 switch 表达式:用箭头 -> 写分支,天然不穿透,还能直接返回一个值赋给变量,配合字符串、枚举判断非常顺手。日常原则:范围判断(大于小于)用 if,枚举值分派用 switch,新代码优先用箭头语法。
示例
if...else if...else 多路判断,注意条件从严到宽的顺序:
public class Main {
public static void main(String[] args) {
int score = 85;
String grade;
if (score >= 90) {
grade = "优秀";
} else if (score >= 80) {
grade = "良好";
} else if (score >= 60) {
grade = "及格";
} else {
grade = "不及格";
}
System.out.println(score + " 分:" + grade);
boolean hasTicket = true;
if (score >= 60 && hasTicket) {
System.out.println("可以入场");
}
}
}
传统 switch 需要 break,漏写会穿透(下面的每个分支都正确写了 break):
public class Main {
public static void main(String[] args) {
int weekday = 3;
switch (weekday) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("周末");
break;
default:
System.out.println("无效的日期");
}
}
}
JDK 14 的 switch 表达式:箭头语法不穿透,还能直接返回值:
public class Main {
public static void main(String[] args) {
String season = "夏";
String advice = switch (season) {
case "春" -> "适合踏青";
case "夏" -> "注意防暑";
case "秋" -> "适合登高";
case "冬" -> "注意保暖";
default -> "未知季节";
};
System.out.println(season + "天:" + advice);
}
}
常见坑
- else if 顺序写反:把 score >= 60 写在 score >= 90 前面,90 分以上永远进不了「优秀」分支。范围条件必须从最严格到最宽松排列。
- 传统 switch 漏 break:case 之间会穿透执行,结果出乎意料。箭头语法的 switch 没有这个问题,新代码优先用它。
- 条件里用赋值号:if (flag = true) 能编译且永远成立。布尔条件推荐写 if (flag),不跟 == true 比较,既简洁又避开这个坑。
- if 后省略花括号:之后随手加一行代码,它并不在分支里,逻辑立刻错乱。团队规范几乎都强制要求写花括号。
小结
if/else if 按顺序短路匹配,范围条件从严到宽;switch 适合枚举分派,箭头语法防穿透还能返回值。下一节学习让程序重复做事:循环结构。