【问题标题】:What is the flow of this block of code这段代码的流程是什么
【发布时间】:2017-06-22 13:56:22
【问题描述】:

我很难理解这段代码,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; 
}

【问题讨论】:

  • 您向我们展示的代码中没有continue 语句
  • 另外,更好地格式化代码将帮助您更好地理解它!
  • 堆栈溢出不会让我的格式更好,因为我的代码错误太多
  • @blackHawk Edit the question 并修复缩进。老实说,Stack Overflow 不会阻​​止您正确缩进代码。
  • 感谢@Dayan 编辑

标签: java android break continue


【解决方案1】:

如果程序读取 continue 代码,那么你的程序会回到 for(;;) 的开头

如果继续代码有效,则此部分将无效

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; 
    }   

【讨论】:

    【解决方案2】:

    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 - 最后一个返回语句永远不会执行,因为for-loop 中没有break; break 让你跳出循环。所以,return (int)j * 2 / 3 + i * 0.0338F; 永远不会执行。

    2 - 无需像您在此处那样调用两次 trim() - int k = Integer.parseInt(this.weight.getText().toString().trim().trim());

    3 - 进行字符串比较时,使用compareToIgnoreCase() 而不是equalsparamUserInfo.ActivityLevel.equals(this.activityArray[1])。像这样, paramUserInfo.ActivityLevel.compareToIngoreCase(this.activityArray[1]) == 0.

    4 - 在处理异常处理时,尽量不要全部捕获。在上面的示例中,您可以简单地捕获 NumberFormatException 而不是 ExceptionRead this!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多