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

当循环没有正确循环并传递最后的输入结果时,尝试do中的catch块

奚卓
2023-03-14
Scanner scan = new Scanner(System.in);   
        int year = -1;
        int yearDuplicate = -1;
        System.out.println("This calculator tells you whether a year that you "
                + "enter is a leap year.\nPlease enter a year:");
        
        do{
            try{
                year = scan.nextInt();
            }catch(Exception e){
                System.out.println("ERROR. Please enter a numerical digit "
                        + "without decimals:");
                scan.next();
            }    
            
        }while(year % 1 != 0);
            
        
        do{
            if(yearDuplicate % 4 == 0){ 
                if(yearDuplicate % 100 == 0){
                    if(yearDuplicate % 400 == 0){
                        System.out.println(yearDuplicate + " is a leap year.");
                    }else{
                        System.out.println(yearDuplicate + " is not a leap year.");
                    }
                }else{
                    System.out.println(yearDuplicate + " is a leap year.");
                }
            }else{
                System.out.println(yearDuplicate + " is not a leap year.");
            }
            
            System.out.println("Enter another year or enter '-1' to quit:");
            try{
                yearDuplicate = scan.nextInt();
            }catch(Exception e){
                System.out.println("ERROR. Please enter a numerical digit "
                        + "without decimals:");
                scan.next();
            }
            
        }while(yearDuplicate != -1);

我正在尝试制作一个闰年计算器,它还可以告诉你是无意中输入了字符串还是双精度而不是整数。我想让这个程序反复运行“错误。请输入一个不带小数的数字:”直到用户输入一个整数。然而,目前,对于第一个try-catch块,如果我输入了两种错误的输入类型,它会给我以下错误消息:

test
ERROR. Please enter a numerical digit without decimals:
-1 is not a leap year.
Enter another year or enter '-1' to quit:
test
ERROR. Please enter a numerical digit without decimals:
BUILD SUCCESSFUL

第二个至少稍微好一点,它不断重复我输入的最后一个整数的结果(年份“是闰年/不是闰年”),但至少它永远重复,不像第一个。

test
ERROR. Please enter a numerical digit without decimals:
10 is not a leap year.
Enter another year or enter '-1' to quit:
test
ERROR. Please enter a numerical digit without decimals:
10 is not a leap year.
Enter another year or enter '-1' to quit:

所有我想要的错误消息得到重播,直到你输入正确的数字。我如何摆脱以前的输入结果,我如何修复第一次尝试捕捉块只运行两次的事实?

我在网上看了一下,但似乎如果我改变了这个程序的一小部分,就会有别的东西坏掉。如果我将第一个while循环的条件设置为while(年份%1==0),它会完全按照我的要求执行;但这意味着如果它是一个整数,while循环会重复,这与我希望它做的正好相反。如果我搞砸了扫描。下一个();,它会给我一个无限的错误循环。

顺便说一句,有两个try-catch块,因为用户在一年内有两次机会进入,我可能需要在两个地方纠正它们。如果我把它们都放在同一个while循环中,第一次就可以了,但在那之后,每次我都需要输入两个数字(第一个try-catch的数字会被第二个try-catch覆盖)。

编辑:我将year和yearDuplicate的起始值更改为0,在try-catch块中声明了扫描仪,并取消了扫描。next();在这两种情况下,试着接球。现在,我得到了一个带有first try catch块的循环,但它仍然继承了我之前的输入。

共有2个答案

解念
2023-03-14

修正了密码。

int year = 0;
        int yearDuplicate = 0;
        System.out.println("This calculator tells you whether a year that you "
                + "enter is a leap year.\nPlease enter a year:");
        
        do{
            Scanner scan = new Scanner(System.in);
            try{
                yearDuplicate = scan.nextInt();
                if(yearDuplicate % 4 == 0){ 
                    if(yearDuplicate % 100 == 0){
                        if(yearDuplicate % 400 == 0){
                            System.out.println(yearDuplicate + " is a leap year.");
                        }else{
                            System.out.println(yearDuplicate + " is not a leap year.");
                        }
                    }else{
                        System.out.println(yearDuplicate + " is a leap year.");
                    }
                }else{
                    System.out.println(yearDuplicate + " is not a leap year.");
                }
                System.out.println("Enter another year or enter '-1' to quit:");  
                
            }catch(Exception e){
                System.out.println("ERROR. Please enter a numerical digit "
                        + "without decimals:");
                scan.next();
            }
            
        }while(yearDuplicate != -1);

基本上移除了第一个试抓块。使第二个try-catch块包含整个do-while循环。如果有人知道我以前犯过什么错误以及为什么他们错了,我还是想知道。

幸阳波
2023-03-14

你的基本读取直到你得到一个整数块应该看起来像这样:

    do {
        try {
            year = scan.nextInt();
            if (year <= 0) { // see comment
                System.out.println("ERROR. Please enter positive number");
            }
        } catch(Exception e){
            System.out.println("ERROR. Please enter a number "
                               + "without decimals");
            scan.next();
            year = -1;
        }                
    } while (year <= 0);

因此,如果有非数字输入,您可以主动设置一个值,该值将导致循环,而不是依赖可能已经存在的值。

另外,你要确保输入是正的。

考虑到你应该能够理解整个程序。

在我说“见评论”的地方,也许你可能想检查一个合理的年份;也许在1752年左右(当时英国和美国采用公历)之前扔掉任何东西。

您最初的问题可能是由于年份%1!=0条件。这意味着“年除以1的余数不是0”。对于非负值来说总是如此。在这种情况下,我必须查看Java如何实现%,寻找负值。

 类似资料:
  • 对于我的程序,我要编写一个程序,它接受2到10之间的行数。生成n行的乘法三角形。每行包含的条目不超过其行大小。这一点我没有问题。但是,在用户将数字0输入到我的问题“请输入要打印的行数:”之后,应该终止循环并打印“感谢您使用此程序!”我用了一个DO。。。WHILE循环以确定用户是否希望继续。在我的循环中,我将用户想要打印的数字声明为int num。我的循环应该持续到num

  • do loop用于执行一定次数的语句。 需要执行语句的次数由传递给do循环的值确定。 语法 (Syntax) do循环语句的语法如下 - do count statement #1 statement #2 ... End Statement#1 and Statement#2是一系列在do循环中执行的语句。 count变量表示do循环需要执行的次数。 流程图 (Fl

  • 当布尔条件为True或者条件变为True时,它会重复封闭的语句块。 它可以随时使用Exit Do语句终止。 此循环结构的语法是 - Do { While | Until } condition [ statements ] [ Continue Do ] [ statements ] [ Exit Do ] [ statements ] Loop -or- Do

  • do循环结构允许迭代地执行语句或一系列语句,而给定条件为真。 语法 (Syntax) do循环的一般形式是 - do var = start, stop [,step] ! statement(s) … end do Where, 循环变量var应该是一个整数 start是初始值 stop是最终值 step是增量,如果省略,则变量var增加1 例如 (For example)

  • 我已经用蓝鸟学习promise两周了。我已经基本理解了它们,但是我去解决了一些相关的问题,似乎我的知识已经崩溃了。我试着做这个简单的代码: 作为一个具体例子: 现在我已经做了作业!还有同样的问题,但在这里面向Q. js: 为promise编写循环的正确方法。 但是接受的答案,以及其他答案: 面向Q.js或RSVP 针对bluebird的唯一答案是使用递归。这些看起来很可能会在无限循环(比如我的循环

  • 与while循环顶部测试循环条件的for和while循环不同, do...while循环do...while循环底部检查其条件。 do...while循环类似于while循环,除了do ... while循环保证至少执行一次。 语法 (Syntax) Perl中do...while循环的语法是 - do { statement(s); }while( condition ); 应该注意的是