0

目前这是我的代码,当用户不选择 A、B、C、D、E 或 F 作为选择时,我需要显示“请输入有效的选择”。问题是如果我在“else”条件下加上“请输入有效的....”语句,Java 会要求我初始化变量 ActivityFactor,因为如果用户没有选择正确的选项,则不会有一个. 有谁知道我该如何解决这个问题?或者知道我应该如何编写一个程序来做到这一点?

if((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("A"))
            ActivityFactor = 1.0;

        else if ((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("B"))
        ActivityFactor = 1.3;

        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("C"))
        ActivityFactor = 1.6;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("C"))
        ActivityFactor = 1.5;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("D"))
        ActivityFactor = 1.7;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("D"))
        ActivityFactor = 1.6;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("E"))
        ActivityFactor = 2.1;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("E"))
        ActivityFactor = 1.9;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("F"))
        ActivityFactor = 2.4;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("F"))
        ActivityFactor = 2.2;
        else
        {
       ActivityFactor = -1;

    }

    //After
    if(ActivityFactor != -1){
     tdee = (nBMR * ActivityFactor);
     System.out.println(tdee);}
    else
   { System.out.println("Please enter a valid choice");
    }
4

5 回答 5

2

如果 if 语句中的条件都不为真,那么您不会为 分配任何内容ActivityFactor,并且在行中使用时不会对其进行初始化double TDEE = (nBMR * ActivityFactor);

要么在你在这里显示的代码之前初始化它,在最后一种情况下给它一个默认值,要么循环直到你得到一个有效的值。

于 2012-12-15T23:25:17.560 回答
1

要么在循环之前初始化变量,要么将整个循环放在一个函数中,然后执行以下操作:

double TDEE = (nBMR * getActivityFactor());

另外,看看这个:http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

快乐编码!;)

于 2012-12-15T23:30:45.960 回答
1

在条件之前将 ActivityFactor 初始化为通常的值。

例如,您可以这样做:

// knowing that it can never be -1
// so if that value remains, you know that user entered wrong letter
ActivityFactor = -1

// then the conditional begins
if((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("A"))
...

// after conditional...
if(activityFactor != -1){
    double TDEE = (nBMR * ActivityFactor);
}

顺便说一句,我建议你使用 'activityFactor' 而不是 ActivityFactor。

于 2012-12-15T23:34:40.987 回答
0

你应该做两件事:

  1. 将逻辑封装在方法中
  2. 如果参数与方法逻辑不匹配,则抛出异常。

您可以通过抛出您将捕获的异常来解决此问题。

private double getTDEE (String inGender, String inActivity) {

   //logic
   else {
     throw new IllegalArgumentException("Please enter a valid choice");
   }

  return (nBMR * ActivityFactor);
}

异常教程

于 2012-12-15T23:35:21.120 回答
0

正如您已经知道的那样,您的代码的问题在于,无论用户是否输入了有效输入,执行都会继续进行。因此,需要进行大量重构——我也会尝试让条件语句更漂亮一些;但这是个人喜好。

可能的解决方案:

a) 使用循环- 然后在用户输入满意的输入时跳出循环..

while( true ){ 
   /* get input from the user */

   /* run through validation checks... 
        and -break- out of the loop when they're satisfied */
}
/* do calculations here */

b)使用一个函数来抽象所有这些逻辑......(正如Psyclops建议的那样)

就个人而言,我会结合使用这些方法 - 将所有这些逻辑提取到一个函数中,该函数在没有输入有效输入时返回 false,然后使用类似的构造while(! yourFunction() )简单地循环遍历它直到它完成。您可以使用通过引用传递来避免必须将返回类型用于布尔值以外的任何内容。

我不会在循环之前初始化变量!这只是意味着程序将继续执行;但是它不会有任何适当的数据 - 这可能比应用程序崩溃更糟糕。

I haven't exactly gifted you the answer in code - but hopefully it's a starting point to allow you to think about how to conceptually compose/design such a solution. That's generally the hardest part.. ;) Good luck.

于 2012-12-15T23:43:17.850 回答