分支结构
根据条件判断结果选择不同的执行路径。Java 中有两种分支结构:if-else 和 switch。
if 语句的三种形式
单条件判断
java
int score = 85;
if (score >= 60) {
System.out.println("及格");
}双条件判断
java
if (score >= 90) {
System.out.println("优秀");
} else {
System.out.println("非优秀");
}多条件判断
java
if (score >= 90) {
System.out.println("等级:A");
} else if (score >= 80) {
System.out.println("等级:B");
} else if (score >= 70) {
System.out.println("等级:C");
} else if (score >= 60) {
System.out.println("等级:D");
} else {
System.out.println("等级:E");
}if 语句的嵌套
在嵌套时使用大括号明确代码块的作用范围。
java
public class NestedIfDemo {
public static void main(String[] args) {
int age = 25;
boolean hasTicket = true;
if (age >= 18) {
System.out.println("年龄符合要求");
if (hasTicket) {
System.out.println("可以入场");
} else {
System.out.println("需要购票");
}
} else {
System.out.println("年龄不符合要求");
}
}
}条件表达式
关系运算符
| 运算符 | 说明 |
|---|---|
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
java
int a = 10;
int b = 20;
if (a == b) { } // false
if (a != b) { } // true
if (a > b) { } // false
if (a < b) { } // true
if (a >= b) { } // false
if (a <= b) { } // true逻辑运算符
| 运算符 | 说明 |
|---|---|
| && | 短路与(AND) |
| || | 短路或(OR) |
| ! | 逻辑非(NOT) |
java
int age = 25;
double salary = 8000;
// 逻辑与
if (age >= 18 && age <= 60) {
System.out.println("在合法工作年龄范围内");
}
// 逻辑或
if (age < 18 || age > 60) {
System.out.println("不在工作年龄范围内");
}
// 组合条件
if ((age >= 22 && salary >= 5000) || (age >= 18 && salary >= 10000)) {
System.out.println("符合贷款条件");
}短路特性
java
int a = 10;
int b = 20;
// 短路与:第一个条件为 false,不再判断第二个
if (a > b && ++a > 0) {
// a > b 为 false,++a 不执行
}
System.out.println(a); // 10
// 非短路与:两个条件都会判断
if (a > b & ++a > 0) {
// 第一个条件为 false,但 ++a 仍然执行
}
System.out.println(a); // 11常见错误
悬空 else 问题
else 与最近的 if 配对,使用大括号避免歧义。
java
// ❌ 错误写法
int a = 10, b = 20, c = 30;
if (a > b)
if (a > c)
System.out.println("a 最大");
else
System.out.println("a 不是最大"); // 实际与 if (a > c) 配对
// ✅ 正确写法
if (a > b) {
if (a > c) {
System.out.println("a 最大");
}
} else {
System.out.println("a 不是最大");
}使用 == 比较浮点数
浮点数存在精度问题,不能直接用 == 比较。
java
// ❌ 错误
double a = 0.1;
double b = 0.2;
if (a + b == 0.3) { // 可能不相等
System.out.println("相等");
}
// ✅ 正确:使用误差范围
if (Math.abs((a + b) - 0.3) < 1e-6) {
System.out.println("近似相等");
}比较字符串使用 equals
字符串比较要用 equals 方法。
java
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
// ❌ 错误:比较的是引用
if (s1 == s2) { } // true(字符串常量池)
if (s1 == s3) { } // false(new 创建新对象)
// ✅ 正确
if (s1.equals(s3)) { } // true
if ("Hello".equals(s3)) { } // 推荐,避免空指针最佳实践
先处理常见情况
java
// ✅ 常见情况放 if,异常情况放 else
if (isValid) {
// 常见情况
} else {
// 异常情况
}
// ❌ 反直觉
if (!isValid) {
// 异常情况
} else {
// 常见情况
}简化布尔表达式
java
// ✅ 简洁明了
if (isActive) { }
if (!isEmpty) { }
// ❌ 画蛇添足
if (isActive == true) { }
if (isEmpty == false) { }使用卫语句减少嵌套
提前返回异常情况,让主逻辑保持扁平。
java
// ✅ 使用卫语句
public void process(Order order) {
if (order == null) return;
if (!order.isValid()) return;
if (!hasPermission()) return;
doProcess(order);
}
// ❌ 嵌套过深
public void process(Order order) {
if (order != null) {
if (order.isValid()) {
if (hasPermission()) {
doProcess(order);
}
}
}
}条件过于复杂时提取方法
java
// ✅ 条件清晰
if (isEligibleForDiscount()) {
applyDiscount();
}
// ❌ 条件复杂难懂
if (age >= 18 && hasAccount && totalAmount >= 100 && !isBlacklisted && orderCount > 0) {
applyDiscount();
}
// 提取方法
private boolean isEligibleForDiscount() {
return age >= 18
&& hasAccount
&& totalAmount >= 100
&& !isBlacklisted
&& orderCount > 0;
}三元运算符
条件表达式也可以用三元运算符简写。
java
// 语法:条件 ? 值1 : 值2
int max = (a > b) ? a : b;
String status = (score >= 60) ? "及格" : "不及格";
int absValue = (x >= 0) ? x : -x;