You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用if条件的情况下终止循环?附Java炮弹计算代码

不用if条件语句终止循环的Java实现方案

嘿,这个问题挺有巧思的——要去掉循环里的if终止判断,咱们其实可以把终止逻辑直接整合到循环的条件中,完全不需要额外的if语句。针对你这段炮弹高度计算的代码,我给你两种实用的方案,尤其是第一种非常贴合你的需求:

方案一:将赋值与判断整合到while循环条件中

这是最简洁也最符合常规编程习惯的方式。Java允许在布尔表达式里使用赋值操作,赋值表达式的结果就是被赋予的值,咱们可以利用这一点,把下一秒高度的计算和终止判断放在while的条件里,直接替代原来的while(true)+if-break结构。

修改后的完整代码如下:

import java.util.Scanner;

public class Tykinkuula {
    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);
        double highest = 0;
        int seconds = 0;
        double height = 0;
        
        System.out.println("Syötä tykinkuulan lähtönopeus: ");
        double startspeed = Double.parseDouble(lukija.nextLine());
        System.out.println("Syötä painovoima: ");
        double gravity = Double.parseDouble(lukija.nextLine());
        
        // 打印初始状态(时间0,高度0,初始速度)
        System.out.println(seconds + "\t" + height + "\t" + startspeed);
        
        // 核心逻辑:在while条件中完成下一秒高度计算+终止判断
        while ((height = startspeed * ++seconds - 0.5 * gravity * Math.pow(seconds, 2)) >= 0) {
            // 更新最高高度(如果需要)
            highest = Math.max(highest, height);
            // 计算当前秒的速度(匀减速公式:v = v0 - g*t)
            double currentSpeed = startspeed - gravity * seconds;
            // 打印当前时间、高度、速度
            System.out.println(seconds + "\t" + height + "\t" + currentSpeed);
        }
        
        lukija.close();
    }
}

逻辑说明:

  • ++seconds先让时间自增1,再计算对应秒数的高度
  • height = ...完成高度计算,这个赋值表达式的结果就是新的height值
  • 直接用>=0判断是否继续循环:如果新高度非负,执行循环体(更新最高高度、打印状态);如果高度为负,直接终止循环,完全不需要if语句。

方案二:利用异常控制流(不推荐)

虽然可以用异常来终止循环,但这种方式属于“滥用异常”,不符合Java的设计规范,只作为思路拓展提一下:
我们可以在高度计算后,用三元运算符配合抛出异常的方式(但注意三元运算符的两边必须是相同类型,所以需要包装一下),不过这种写法可读性极差,实际开发中绝对不建议使用:

// 示例片段,仅作思路展示,不推荐使用
do {
    seconds++;
    height = startspeed * seconds - 0.5 * gravity * Math.pow(seconds, 2);
    // 用三元运算符触发异常来终止循环,完全不用if
    Object dummy = height >= 0 ? null : new RuntimeException("Height negative");
    System.out.println(seconds + "\t" + height + "\t" + (startspeed - gravity * seconds));
} while (true);

然后在main方法外层捕获这个异常,但这种写法既不优雅也不高效,所以还是方案一最实用。

内容的提问来源于stack exchange,提问作者Katrina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:55:11