「Java流程控制」跳转语句

0 阅读6分钟

今天来聊聊Java里的两个重要跳转语句——break和continue。它们就像马路上的交通信号灯,能够控制程序执行的流向。

break和continue

break和continue在循环中的作用,特别像快递分拣中心的工作场景:

  • break:就像发现一个破损包裹,直接停止当前分拣流程,把它扔进异常品处理区
  • continue:就像看到一个地址模糊的包裹,暂时跳过它继续处理后面的包裹

这两种处理方式都能让分拣工作更高效,我们的程序也是如此。

break语句

break就像紧急刹车,会立即终止当前循环。来看一个寻找数字的例子:

# 源文件保存为“BreakDemo.java”
public class BreakDemo {
    public static void main(String[] args) {
        int[] numbers = {3, 8, 15, 21, 7, 12};
        int target = 21;
        boolean found = false;
        
        for(int i=0; i<numbers.length; i++) {
            System.out.println("正在检查第" + (i+1) + "个数字:" + numbers[i]);
            
            if(numbers[i] == target) {
                found = true;
                System.out.println("找到了目标数字!");
                break;  // 找到后立即退出循环
            }
        }
        
        if(!found) {
            System.out.println("数组中没有目标数字");
        }
    }
}

运行结果:

正在检查第1个数字:3 正在检查第2个数字:8 正在检查第3个数字:15 正在检查第4个数字:21 找到了目标数字!

在这个例子中,一旦找到目标数字,break就会让循环立即终止,不再检查后面的元素。就像找到钥匙后就不会继续翻其他口袋一样。

continue语句

continue则是跳过当前这次循环,直接进入下一次。来看一个打印奇数的例子:

# 源文件保存为“ContinueDemo.java”
public class ContinueDemo {
    public static void main(String[] args) {
        System.out.println("1到10之间的奇数:");
        
        for(int i=1; i<=10; i++) {
            if(i % 2 == 0) {
                continue;  // 跳过偶数
            }
            System.out.print(i + " ");
        }
    }
}

输出结果:

1到10之间的奇数: 1 3 5 7 9

这个程序中的continue的作用是遇到偶数就跳过打印语句,直接进入下一轮循环。就像点名时跳过请假的人,直接点下一个。

常见错误与解决方法

break用错位置

for(int i=0; i<5; i++) {
    if(i == 3)
        System.out.println("找到3");
    break;  // 这个break会每次循环都执行
}

解决方法:注意break的位置,确保只在满足条件时执行。

continue导致死循环

int i = 0;
while(i < 5) {
    if(i == 2) {
        continue;  // 跳过i++,导致无限循环
    }
    System.out.println(i);
    i++;
}

解决方法:在while循环中使用continue要确保迭代语句不被跳过。

误用标签

outer:
for(int i=0; i<3; i++) {
    for(int j=0; j<3; j++) {
        if(j==1) break outer;  // 正确用法
        if(j==1) continue outer;  // 正确用法
        if(j==1) break;  // 只跳出内层循环
    }
}

解决方法:理解带标签的break/continue可以控制外层循环。

案例解析

编写一个程序,结合break和continue实现用户登录验证。

# 源文件保存为“LoginSystem.java”
import java.util.Scanner;

public class LoginSystem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String correctPassword = "java123";
        int attempts = 3;
        
        while(attempts > 0) {
            System.out.print("请输入密码(还剩" + attempts + "次尝试):");
            String input = scanner.nextLine();
            
            if(input.isEmpty()) {
                System.out.println("密码不能为空!");
                continue;  // 跳过本次循环剩余部分
            }
            
            if(input.equals(correctPassword)) {
                System.out.println("登录成功!");
                break;  // 密码正确,退出循环
            } else {
                System.out.println("密码错误!");
                attempts--;
            }
        }
        
        if(attempts == 0) {
            System.out.println("尝试次数过多,账户已锁定!");
        }
        
        scanner.close();
    }
}

运行结果 分别输入错误密码和正确密码

请输入密码(还剩3次尝试):123 密码错误! 请输入密码(还剩2次尝试):java123 登录成功!

代码亮点:

  • 使用continue跳过空密码的情况
  • 使用break在密码正确时提前退出
  • 清晰的尝试次数提示
  • 合理的账户锁定机制

这个案例展示了如何在实际应用中合理使用跳转语句来优化程序流程。

综合练习题

理论思考题

  1. 下面代码输出什么?

    for(int i=0; i<5; i++) {
        if(i == 2) continue;
        if(i == 4) break;
        System.out.print(i + " ");
    }
    

    答案:输出"0 1 3 ",跳过2,遇到4时终止。

  2. 下面代码有什么问题?

    for(int i=0; i<10; i++) {
        if(i % 3 == 0) continue;
        System.out.println(i);
        i++;  // 与continue一起使用可能导致逻辑错误
    }
    

    解析:continue后i++会执行两次,可能导致跳过更多元素。

  3. 如何用break语句实现查找二维数组中的特定值? 示例

    int[][] matrix = {{1,2},{3,4}};
    outer:
    for(int i=0; i<matrix.length; i++) {
        for(int j=0; j<matrix[i].length; j++) {
            if(matrix[i][j] == 3) {
                System.out.println("找到3,位置:"+i+","+j);
                break outer;
            }
        }
    }
    

实战编程题

  1. 编写程序找出100以内的所有质数,使用continue优化循环

    # 源文件保存为“PrimeNumbersWithContinue.java”
     public class PrimeNumbersWithContinue {
         public static void main(String[] args) {
             System.out.println("100以内的质数:");
             outer:
             for (int i = 2; i <= 100; i++) {
                 for (int j = 2; j * j <= i; j++) {
                     if (i % j == 0) {
                         continue outer;  // 不是质数,跳过检查
                     }
                 }
                 System.out.print(i + " ");
             }
         }
     }
    
    

    运行结果

    100以内的质数: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

  2. 模拟ATM机操作,要求:

    • 显示菜单:查询、存款、取款、退出
    • 用break实现退出功能
    • 用continue处理无效输入
    # 源文件保存为“ATMSystem.java”
    import java.util.Scanner;
    
    public class ATMSystem {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            double balance = 1000.0;
    
            while(true) {
                System.out.println("1.查询余额 2.存款 3.取款 4.退出");
                System.out.print("请选择:");
                String choice = scanner.next();
    
                if(choice.equals("4")) {
                    System.out.println("感谢使用,再见!");
                    break;
                }
    
                if(!choice.matches("[1-4]")) {
                    System.out.println("输入无效,请重新选择");
                    continue;
                }
    
                switch(choice) {
                    case "1":
                        System.out.printf("当前余额:%.2f元\n", balance);
                        break;
                    case "2":
                        System.out.print("请输入存款金额:");
                        balance += scanner.nextDouble();
                        break;
                    case "3":
                        System.out.print("请输入取款金额:");
                        double amount = scanner.nextDouble();
                        if(amount > balance) {
                            System.out.println("余额不足!");
                        } else {
                            balance -= amount;
                        }
                        break;
                }
            }
    
            scanner.close();
        }
    }
    

    运行结果 依次输入数据,验证结果

    1.查询余额 2.存款 3.取款 4.退出 请选择:1 当前余额:1000.00元 1.查询余额 2.存款 3.取款 4.退出 请选择:2 请输入存款金额:100 1.查询余额 2.存款 3.取款 4.退出 请选择:3 请输入取款金额:200 1.查询余额 2.存款 3.取款 4.退出 请选择:4 感谢使用,再见!

  3. 打印特殊数字图案:

    1 2 4 3 6 9 4 8 12 16

    要求:使用continue跳过能被5整除的数。

    # 源文件保存为“NumericalFigure.java”
    public class NumericalFigure {
        public static void main(String[] args) {
            for(int i=1; i<=4; i++) {
                for(int j=1; j<=i; j++) {
                    int num = i * j;
                    if(num % 5 == 0) continue;
                    System.out.print(num + " ");
                }
                System.out.println();
            }
        }
    }
    

break和continue就像程序中的交通警察,能够灵活地控制代码的执行路径。合理使用它们可以让程序更高效、更易读。记住,break是彻底结束循环,continue是跳过当前这一轮,就像生活中遇到障碍时,可以选择放弃任务(break)或者跳过当前障碍继续前进(continue)。