我很难理解这段代码,continue
语句让我感到困惑。
请注意,activityArray
是字符串数组,而paramUserInfo.ActivityLevel
返回一些String
。
private float calculateWater(UserInfo paramUserInfo)
{
int i = 0;
int j = 0;
if (paramUserInfo.ActivityLevel.equals(this.activityArray[0])) {
i = 0;
}
for (;;){
try{
int k = Integer.parseInt(this.weight.getText().toString().trim().trim());
j = k;
}
catch (Exception localException){
continue;
}
if (!paramUserInfo.Unit.equals("Kgs")) {
continue;
}
return (j * 2.202F * 2.0F / 3.0F + i * 0.0338F) * 29.57F;
if (paramUserInfo.ActivityLevel.equals(this.activityArray[1])) {
i = 175;
} else if (paramUserInfo.ActivityLevel.equals(this.activityArray[2])) {
i = 530;
} else if (paramUserInfo.ActivityLevel.equals(this.activityArray[3])) {
i = 700;
}
}
return (int)j * 2 / 3 + i * 0.0338F;
}
答案 0 :(得分:0)
Continue用于跳过当前迭代并继续下一步。
因此,请将此部分代码作为示例:
try{
int k = Integer.parseInt(this.weight.getText().toString().trim().trim());
j = k;
}
catch (Exception localException){
continue; //Do not execute anything else, go to next iteration.
}
如果捕获到异常,它将忽略它并简单地移动到下一次迭代。
你必须非常小心,因为这个无限的for循环,因此for(;;)
没有时间呼吸。如果您试图在主线程上运行这段代码,它将崩溃。
如果您希望它快速运行,请包含Thread.sleep(0,2)
,并确保它在自己的线程上运行。
除此之外,此代码还有很多问题。
1 - 最后一个return语句永远不会执行,因为break
中没有for-loop
; break让你走出循环。因此,return (int)j * 2 / 3 + i * 0.0338F;
无法执行。
2 - 无需像在此处trim()
那样拨打int k = Integer.parseInt(this.weight.getText().toString().trim().trim());
两次。
3 - 进行字符串比较时,请使用compareToIgnoreCase()
代替equals
。 paramUserInfo.ActivityLevel.equals(this.activityArray[1])
。像这样,
paramUserInfo.ActivityLevel.compareToIngoreCase(this.activityArray[1]) == 0
。
4 - 处理异常处理时,尽量不要全部捕获。在上面的示例中,您只需抓取NumberFormatException
而不是Exception
。 Read this!
答案 1 :(得分:0)
如果程序读取继续代码,那么程序将返回到(;;)
的开头如果继续代码有效,此部分将无效
return (j * 2.202F * 2.0F / 3.0F + i * 0.0338F) * 29.57F;
if (paramUserInfo.ActivityLevel.equals(this.activityArray[1])) {
i = 175;
} else if (paramUserInfo.ActivityLevel.equals(this.activityArray[2])) {
i = 530;
} else if (paramUserInfo.ActivityLevel.equals(this.activityArray[3])) {
i = 700;
}