如何使代码与try-catch一起使用? BMI例外

时间:2019-04-07 00:07:02

标签: java exception try-catch

我似乎无法在我的代码中尝试捕获。我对此很陌生,必须使用它。我需要用户输入输入,然后我需要检查该输入(可能是循环检查)是否有异常捕获的错误。

-通过确保用户输入的正整数(英尺),非负的十进制数字(英寸)和正的十进制数字(重量)来执行输入验证。

-此外,将输入的值范围限制为每个值的逻辑范围。例如,当输入以英尺为单位的高度时,一个相当合理的范围应包括从4到7的值。以类似的方式约束英寸和体重。

任何帮助将不胜感激!我觉得我要的很多,但是已经坚持了好几个星期了:/

正如您在我的代码中看到的那样,我已经尝试了一些东西,例如带有try catch和异常的while循环。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double weight = 0; //positive decimal number
    int heightFeet = 0; //positive int number for feet
    double heightIn = 0;//nonnegative decimal number for inches
    double BMI;

    System.out.print("Enter height using feet space inches (e.g., 5 6.25): ");
    while(true){
        try {
            heightFeet = Integer.parseInt(in.next());
            heightIn = Double.parseDouble(in.next());
            break;
        }
        catch (Exception e){
            System.out.println("Invalid feet value. Must be an integer.");
            System.out.println("Invalid inches value. Must be a decimal number.");
            System.out.print("Re-enter height using feet space inches (e.g., 5 6.25): ");
        }
    }//end while


    System.out.print("Enter weight in pounds: ");
    while(true){
        try {
            weight = Double.parseDouble(in.next());
            break;
        }
        catch (Exception ex){
            System.out.println("Invalid pounds value. Must be positive.");
            System.out.println("Re-enter weight in pounds: ");
        }
    }//end while


    final int bmi = 704;
    double heightNew = (heightFeet * 12) + heightIn;

    BMI = Math.round(((weight * bmi) / (heightNew * heightNew))); //BMI
    //needs to round up, not down

    //constrain range of values able to be entered
    //feet should be 4-7
    //inches and weight similar

    //end print result
    System.out.println("\nheight = " + heightFeet + "'-" + heightIn + "\"");
    System.out.println("weight = " + weight + " pounds");
    System.out.print("body mass index = " + BMI);

    in.close();
}//end main

输出应如下所示:

使用英尺间隔英寸输入高度(例如5 6.25):在那里
无效的英尺值。必须为整数。
无效的英寸值。必须为十进制数字。
以英尺为单位重新输入高度(例如5 6.25):0 9
无效的英尺值。必须是积极的。
以英尺为单位重新输入高度(例如5 6.25):5.25 0
无效的英尺值。必须为整数。
用英尺间隔英寸(例如5 6.25)重新输入高度:5 9.25
以磅为单位输入体重:0
无效的磅值。必须是积极的。
重新输入的磅数为150.5

高度= 5'-9.25”
体重= 150.5磅
体重指数= 22.1

1 个答案:

答案 0 :(得分:0)

我敢打赌,您会觉得自己离我们很近,可以品尝到……而且确实如此。注意事项:

让我们从"Enter height using feet space inches (e.g., 5 6.25): "提示符开始。我个人并不坚信while (true) {的情况。当然可以使用它,但是人们倾向于养成一直使用它的习惯,并且有一段时间这种做法会咬人并引起头痛。由于无论如何您都需要满足所有输入的某些约束,因此利用布尔值标志不会受到任何损害,而如果所有输入都已通过约束,则退出 while 循环,例如:

boolean pass = false;
while (!pass) {
    /* .... Your Prompt Code .... */
}

pass = false;
while (!pass) {
    /* .... Your Other Prompt Code .... */
}

对于 heightFeet 变量:

很明显,如果为要提供支脚的令牌位置提供了除Integer值以外的任何值(在提供的空格之前的第一个提供的值),则会抛出并捕获 NumberFormatException (这将包括一个包含小数点的数值)。这样会显示您向控制台发送的消息,指示这样,用户可以重试,这很好。但是,如果令牌点包含的值小于 4或值大于 7,则变量将填充该值,并且< strong> heightIn 变量将在接下来处理。到目前为止,但还不错,请记住,您不希望值小于4或大于7。

对于 heightIn 变量:

如果下一个标记点​​(在提供的空格之后的第二个提供的值)不是Integer或Double数值,则再次抛出 NumberFormatException ,并再次发送消息至这样会显示控制台,用户可以重试,这也很好。但是,如果该标记点包含的数字值小于或小于 0.0(或0)(或0)或小于或大于 11.99,那么,是的。...该值将被添加到 heightIn 变量。没关系,但是现在该是在继续前进之前执行所需约束的时候了。您想检查 heightFeet heightIn 变量中包含的值,以确保它们满足 之前的必要条件在 while 循环之外。

在这里您将使用一个或多个 if 语句来检查每个变量的条件并确保它们满足约束条件。

/* Is feet greater than 3 and less than 8 (4 to 7) and 
   is inches 0 or greater and less than 12   */
If (heightFeet > 3 && heightFeet < 8 && heightIn >= 0.0d && heightIn <= 11.9375d) {
    // All is Good!
    pass = true;    // set to true so as to exit the while loop.
}
else {
    // Hmmm....something's not right.
    System.out.println("The height supplied (" + hightFeet + " " + 
             heightIn + ") is invalid! Try again:");
}

当然,您会摆脱 break; 语句,不再需要它。

为什么将<= 11.9375d用作 heightIn 变量条件的一部分?一英尺有12英寸,因此任何超过11-15 / 16英寸的东西都可以视为1英尺。请注意,我认为没有人能将一个人的身高测量到16英寸,但以防万一。当然,如果您愿意,也可以减少到说11.75(11和3英寸的瓜塔尔)。

现在出现"Enter weight in pounds: "提示:

尝试使用与上一个提示类似的概念:)