如何使用try-catch使代码工作? BMI例外

问题描述 投票:0回答:1

我似乎无法尝试catch在我的代码中工作。我对此很新,我必须使用它。我需要用户输入输入,然后我需要检查输入,可能是在一个循环中,错误,被异常捕获。

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

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

任何帮助将非常感激!我觉得我要求很多,但我已经坚持了几个星期:/

正如你在我的代码中看到的那样,我尝试了一些东西,比如一个带有try catch和exception的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

java exception try-catch
1个回答
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的值,则该变量将填充该值,并且接下来将处理heightIn变量。到目前为止一直很好,但请记住,您不希望值小于4或大于7。

对于heightIn变量:

如果下一个标记点​​(提供的空格之后的第二个提供的值)是除了Integer或Double数值之外的任何值,那么将再次抛出并捕获NumberFormatException,并再次显示指向控制台的消息,并且用户可以再试一次,这也很好。但是,如果该令牌点包含小于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: "提示:

尝试使用与之前提示相似的概念:)

© www.soinside.com 2019 - 2024. All rights reserved.