当前位置: 首页 > 知识库问答 >
问题:

如何使代码与try-catch一起工作?BMI异常

鞠泰平
2023-03-14

我似乎无法在代码中使用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 (Excepthtml" target="_blank">ion 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)输入高度:hi there
无效英尺值。必须是整数。
英寸值无效。必须是十进制数字。
使用英尺空间英寸重新输入高度(例如,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个答案

蒋波光
2023-03-14

我敢打赌,你觉得自己离我很近,你就能尝到它的味道...你确实是。要考虑的事项:

让我们从“Enter height using feet space inches(例如,5 6.25):”提示符开始。我个人不是while(true){条件的坚定信仰者。它当然可以使用,但人们往往会养成一直使用它的习惯,总有一天这种做法会让人头疼。由于您需要对所有输入满足特定的约束,因此使用布尔标志也无妨,而如果所有输入都通过了约束,则退出while循环,例如:

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

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

对于heightFeet变量

显然,如果为要提供feet的令牌点提供了整数值以外的任何值(提供的空格之前的第一个提供的值),则将抛出并捕获NumberFormatException(这将包括一个包含小数点的数值)。您到控制台的消息显示为这样的指示,用户可以再试一次,这是很好的。但是,如果令牌点包含小于4的值或大于7的值,则将用该值填充变量,然后处理heightIn变量。到目前为止还不错,但请记住,您不希望值小于4或大于7。

对于heightIn变量:

如果下一个标记点(在提供的空格之后的第二个提供的值)不是整数或双数值,那么将再次抛出并捕获NumberFormatException,并且再次显示到控制台的消息以指示这样的情况,用户可以再试一次,这也是很好的。但如果令牌点包含小于0.0(或0)或大于11.99的数值,则是....该值将添加到heightIn变量中。这也是可以的,但现在是时候强制执行所需的约束,然后再继续。在退出while循环之前,您希望检查heightFeet和heightIn变量中包含的值,以确保它们满足必要的条件。

在这里,您将使用一个或多个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:");
}

当然,您可以删除中断;语句,它不再需要了。

为什么使用<=11.9375d作为heightIn变量条件的一部分?每英尺有12英寸,所以超过11-15/16英寸的都可以被认为是1英尺。请注意,我不认为任何人测量一个人的16英寸,但以防万一。当然,如果你愿意的话,这个数值可以降低到11.75(每英寸11加3个卫士)。

现在,“Enter weight in l磅:”提示:

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

 类似资料:
  • 由于ELMAH记录未处理的异常,我想通过ELMAH来记录所有错误,这是否意味着我不应该在代码中的任何地方使用try-catch块?如果我不使用它,它将显示死亡的黄色屏幕,我相信我可以通过自定义错误页面处理。 所以,我认为如果你用ELMAH,试抓块就没用了,对吗?如果不是,在ELMAH中使用try catch的用例有哪些?

  • 问题内容: 我想了解块和堆栈跟踪的工作原理。 我正在阅读这篇有关异常处理反模式的出色文章,发现以下段落: 这破坏了原始异常的堆栈跟踪,并且总是错误的。 那之后,我意识到,我并不 真的 知道如何工作。我的理解如下。考虑示例: 当我调用时,调用链 在调用堆栈上 留下两个堆栈帧(用于和函数)。当在中引发异常时,程序将使执行堆栈冒泡,直到找到处理该异常的块为止。同时,它释放了堆栈框架,并将堆栈跟踪信息附加

  • 我的pom。xml如下所示 我已经尝试了三天,使用REdhat入门指南让这个简单的示例代码与Infinispan一起使用,并下载了快速入门zip来运行它,但仍然不起作用!我一直收到Spring JMS的错误“无法连接到foo: 11222”或“池未打开”,然后是关于混合Uber和Jars版本的警告。我开始使用ehcache,这很难实现,因为只有有限的简单示例展示了如何从rest调用等中存储、检索和

  • 我最近安装了privacy vpn,结果发现启用的openvpn会破坏Docker。 当我尝试运行时,我得到以下错误 禁用vpn可以解决这个问题(不过,我宁愿不禁用它)。有没有办法使这两者和平共处?我使用debian jessie,我的openvpn有以下版本字符串 null

  • 我设置了一个HTTPS代理,这样HTTP客户端就可以安全地向代理发送普通HTTP请求。例如,客户机可以向代理发送加密的HTTP GET请求,代理将删除加密并将普通HTTP GET请求发送到终端站点。 我了解到这不是一个常见的设置,只有GoogleChrome具有内置功能来支持这样的场景。(信息在这里-http://wiki.squid-cache.org/Features/HTTPS#Encryp

  • 在windows server 2008 r2和IIS版本7.5中安装了SiteMinder Web代理(ca-wa-IIS7-12.0-sp3-cr010-win64.exe)。IIS服务器下有2个网站(A、B),而代理仅针对一个网站A(在安装过程中选择一个网站)。我没有有效的策略服务器,因此在配置Web代理时输入假IP。 然后在浏览器中访问A,如预期的那样出现错误,但在浏览器中访问B,服务器也