【问题标题】:Why is this do-while loop not working appropriately?为什么这个 do-while 循环不能正常工作?
【发布时间】:2014-03-08 16:44:39
【问题描述】:

我有这个学校作业,我想通过合并一个 do 循环来进一步完成它,但它并没有按照预期的方式工作。我试图让它重复整个程序,直到输入正确,比如说如果有人输入一个字符串而不是一个整数,那么它会重复这个程序。

我该怎么做?

请不要提供更好的方法来编写这个程序,因为它是教师正在寻找的。我知道有更好的方法来编写它,因为我已经这样做了。

public class Grade {
    public static void main(String[] args) {
        ConsoleReader console = new ConsoleReader(System.in);

        int i = 1;
        do {
            System.out.println("Enter your grade percentage:");
            int percent = (int) console.readDouble();
            Math.round(percent);
            percent = (int) percent / 10;
            String grade ="Input was not valid";

            if(percent <= 5){
                grade = "Your grade is an F, Work Harder so you won't have to retake!";
                System.out.println(grade);
                i = 9999999;
            }else{
                switch (percent){

                case 6:
                    grade = "Your grade is a D, work harder";
                    System.out.println(grade);
                    i = 9999999;
                    break;
                case 7:
                    grade = "Your grade is a C, That's average but you could do better.";
                    System.out.println(grade);
                    i = 9999999;
                    break;
                case 8:
                    grade = "Your grade is a B, That is pretty good but strive for that A";
                    System.out.println(grade);
                    i = 9999999;
                    break;
                case 9:
                    grade = "Your grade is a A, Good Work!!";
                    System.out.println(grade);
                    i = 9999999;
                    break;
                case 10:
                    grade = "Your grade is a A, Good Work!!";
                    System.out.println(grade);
                    i = 9999999;
                    break;
                default:
                    grade = "Your input was invalid, Please enter your grade percentage.";
                    System.out.println(grade);
                    i++;
                    break;
                }
            }
        }while(i != 9999999);
    }
}

【问题讨论】:

  • 整数除法警告!警告!传值警告!这是你应该研究的两件事。
  • 如果用户输入了不正确的数据,那么它会抛出异常而你根本没有捕捉到它
  • 预期的行为究竟是什么?顺便说一句,你为什么要舍入一个 int?
  • 是的,如果你输入字符串而不是整数,它应该抛出异常
  • 尝试调试它,例如通过 System.out.println 输出 i 值或设置一些断点

标签: java loops do-while


【解决方案1】:

有一个名为 Exception handling 的主题你应该研究一下

举例说明

boolean done = false;
do {

 try{
  System.out.println("Enter your percentage");
  int percent = (int) console.readDouble();

  // more code
  // if the condition is satisfied then assign done = true;

 } catch(InputMismatchException e) {
    System.out.println("Please input only numbers");
 }
} while(!done);

如果用户输入的不是数字,那么readDouble 方法会抛出异常,在这种情况下是InputMismatchException。

控件将转到catch 块,警告消息将打印给用户,而无需执行readDouble 方法之后的任何其他代码。

并且由于变量done 的boolean 值仍然为false,因此将再次执行while 循环。

【讨论】:

  • 这对我来说非常有效,只是我花了一些时间才弄清楚这是一个 NumberFormatException 而不是 InputMismatchException 谢谢!
  • 因为我不知道ConsoleReader 类是什么,所以我在示例中使用了Console 类.. 很高兴我能提供帮助.. :)
【解决方案2】:

我相信,这并没有达到你的预期:

int percent = (int) console.readDouble();
Math.round(percent);
percent = (int) percent / 10;

Math#round 函数返回一个舍入值,它不会舍入分配给 percent 的值。此外,它不会产生影响,因为不存在圆形 int 这样的东西。您只能调用该方法,因为 Java 编译器应用了类型扩展。这很有可能会弄乱您的数据。简单地将 double 转换为 int 并不是转换数据的好方法。

此外,console.readDouble() 将在用户输入无法解析为双精度的内容时引发异常。您应该尝试读取 try catch 块中的值,在该块中处理 catch 块中的无效输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多