Java 流程控制

Java 的条件、循环与分支:if/switch、for/while、break/continue 如何组织结构化控制流。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Java 流程控制

这个概念为什么出现

业务规则是分支与循环的组合:库存够不够、状态机如何跳转、批处理如何扫单。Java 提供结构化控制流,避免回到随意 goto 风格。

[!abstract] 一句话理解 用 if/elseswitchfor/while/do-whilebreak/continue 组织分支与迭代;条件必须是 boolean(不同于 C 的整数即真)。

最小可运行示例

先把示例放进业务场景,再看代码:

场景:批处理任务按订单状态分流并跳过已取消单

扫描订单数组:取消跳过,待支付计数,已支付累加金额。
教学点:for-eachifcontinueswitch

public class OrderBatch {
    enum Status { CREATED, PAID, CANCELLED }

    static final class Order {
        final String id;
        final Status status;
        final int amountCents;

        Order(String id, Status status, int amountCents) {
            this.id = id;
            this.status = status;
            this.amountCents = amountCents;
        }
    }

    // summarize:生成批处理摘要。
    //
    // 业务意图:一遍扫描得到待支付数量与已支付总额。
    // 教学点:continue 跳过取消单;switch 按状态分流。
    static void summarize(Order[] orders) {
        int pending = 0;
        int paidSum = 0;
        for (Order o : orders) {
            if (o.status == Status.CANCELLED) {
                // 取消单不进入后续统计。
                continue;
            }
            switch (o.status) {
                case CREATED -> pending++;
                case PAID -> paidSum += o.amountCents;
                default -> {
                    // CANCELLED 已 continue;保留 default 防漏新状态。
                }
            }
        }
        System.out.println("pending=" + pending + " paidSum=" + paidSum);
    }

    public static void main(String[] args) {
        Order[] orders = {
            new Order("1", Status.CREATED, 100),
            new Order("2", Status.PAID, 200),
            new Order("3", Status.CANCELLED, 300),
            new Order("4", Status.PAID, 50)
        };
        summarize(orders);
    }
}

建议运行:

javac OrderBatch.java && java OrderBatch

期望输出:

pending=1 paidSum=250

结合场景再看三个关注点

  1. 条件必须是 booleanif (stock)int 不成立。
  2. switch 要有默认策略,防止新增枚举值时静默漏处理。
  3. continue/break 降低嵌套,但过深循环应拆方法。

核心概念与准确模型

1. if / else

  • 条件表达式类型为 boolean
  • else if 链表达互斥优先级时,把高频/便宜条件放前面

2. switch

  • 经典语句形态与较新的 switch 表达式 / 箭头标签随版本增强
  • 对枚举与字符串切换很实用
  • 注意 break 贯穿(传统冒号语法)问题;箭头形态避免贯穿

3. 循环

形态适合
for已知次数/索引扫描
增强 for遍历数组/Iterable
while条件驱动
do-while至少一次

4. break / continue / 标签

  • break 结束循环或 switch
  • continue 结束本轮
  • 标签 break 可跳出多层——可读性成本高,优先重构

边界情况与反直觉行为

  1. 增强 for 不能改结构(对集合 fail-fast 的细节见集合篇)。
  2. 浮点当循环条件易死循环或误差。
  3. 空数组 for-each 安全,零次迭代。

常见误区

[!warning] 常见误区:switch 忘记 break 传统冒号语法会贯穿到下一 case。箭头标签 -> 更不易踩坑。

工程实践

  1. 复杂分支用多态或策略表替代巨型 switch(OOP 阶段再深化)。
  2. 循环体内避免重复计算不变式。
  3. 批处理记录“处理/跳过/失败”计数,便于对账。

本节总结

  • 结构化分支与循环是业务规则骨架
  • boolean 条件、枚举 switch、增强 for 是日常主力
  • 版本带来的 switch 表达式应查当前 JDK 文档

自测题

  1. 为什么 if (1) 在 Java 非法?
  2. 批处理中 continue 与把条件嵌套在大 if 里如何取舍?
参考答案
  1. 条件必须是 boolean,防止 C 式整数误用。
  2. 早继续可降低嵌套、突出主路径;但过多 continue 也要拆方法保持清晰。

延伸阅读与资料来源

资料类型支撑内容
JLS Statements规范语句与控制流
创建于 2026/7/15 更新于 2026/7/15