目前这是我的代码,当用户不选择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");
}
答案 0 :(得分:2)
如果if语句中没有条件为真,那么您不会向ActivityFactor
分配任何内容,并且在行double TDEE = (nBMR * ActivityFactor);
中使用时不会对其进行初始化。
在你在这里显示的代码之前初始化它,在最后一种情况下给它一个默认值,或者循环直到你得到一个有效值。
答案 1 :(得分:1)
在循环之前初始化变量,或者将整个循环放在函数中,然后执行以下操作:
double TDEE = (nBMR * getActivityFactor());
另外,请看一下:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
快乐的编码! ;)答案 2 :(得分: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。
答案 3 :(得分:0)
你应该做两件事:
您可以解决此问题,抛出您将捕获的异常。
private double getTDEE (String inGender, String inActivity) {
//logic
else {
throw new IllegalArgumentException("Please enter a valid choice");
}
return (nBMR * ActivityFactor);
}
答案 4 :(得分: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() )
这样的构造来简单地循环直到它完成。您可以使用通过引用传递,以避免必须将返回类型用于布尔值以外的任何内容。
我不会在循环之前初始化变量!这只是意味着程序将继续执行;但它没有任何适当的数据 - 这可能比刚刚崩溃的应用程序更糟糕。
我还没有完全给你代码中的答案 - 但希望这是一个让你思考如何在概念上构思/设计这样一个解决方案的起点。这通常是最困难的部分..;)祝你好运。