Skip to content

分支结构

根据条件判断结果选择不同的执行路径。Java 中有两种分支结构:if-elseswitch

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;

基于 VitePress 构建