如何在不使用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
相关产品推荐
相关产品推荐

