如何在while语句外获取递增的p变量并返回?代码语法是否正确?
问题解答
一、语法与逻辑问题检查
原代码存在两处关键问题:
- 局部变量未初始化:
int p;仅声明未初始化,虽然当前分支逻辑(else直接return -1)不会触发未使用错误,但不符合Java局部变量必须初始化的最佳实践,后续代码修改易引发编译问题。 - 循环逻辑失效:
result仅在循环外计算一次Math.pow(bounce, n),循环内n递增但result未重新计算,导致result*h的值固定不变,要么循环直接不执行,要么进入无限循环。
二、实现“在while外部获取递增后的p并返回”的方案
要在while循环外部拿到更新后的p值,核心是保证p的作用域覆盖循环和返回语句,同时修正循环逻辑让p正确递增。以下是修正后的代码:
package src; public class Ball { public static int bounceBall(double h, double bounce, double window) { // 初始化p,避免未初始化问题 int p = 0; // 参数合法性校验 if (h > 0 && bounce > 0 && bounce < 1 && window < h) { p = 1; // 第一次下落经过窗口,计数初始化为1 double currentHeight = h * bounce; // 第一次弹起的高度 // 每次弹起高度超过窗口,下落时会再次经过窗口,计数+1 while (currentHeight > window) { p++; currentHeight *= bounce; // 计算下一次弹起的高度 } } else { return -1; } // 直接返回循环后更新的p值 return p; } }
关键说明:
- 作用域控制:将
p的声明移到if分支外并初始化,使其作用域覆盖整个方法,循环内修改后,方法末尾的return语句自然能拿到最新值。 - 逻辑修正:每次循环内更新当前弹起高度,确保循环能正确终止,同时p随着每次有效弹跳(弹起高度超过窗口)递增,符合实际计数逻辑。
内容的提问来源于stack exchange,提问作者d oko
相关产品推荐
相关产品推荐

