ทำไมฉันถึงมี do- while loop ที่ไม่มีวันสิ้นสุด?

ฉันมี do-while ลูปที่ไม่ทำงาน เมื่อฉันป้อน String แทนที่จะเป็น int มันควรจะพูดว่า "bla" และขอให้ใส่ตัวเลขอีกครั้ง แต่จะส่งข้อความซ้ำแล้วซ้ำอีก มีอะไรผิดปกติในรหัสนี้?

    boolean i = true;
    do {
       i = false;  

       try {
           System.out.println("insert number");
           int k = sc.nextInt();  
       }
       catch(InputMismatchException e) {
           System.out.println("test");
           i = true;
       } 
   } while ( i== true);

person Pedro Costa    schedule 01.07.2013    source แหล่งที่มา
comment
ดู docs.oracle.com/javase/7/docs /api/java/util/Scanner.html: When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method.. ดังนั้น คุณต้องข้ามโทเค็นเมื่อคุณได้รับ InputMismatchException   -  person Andreas Fester    schedule 01.07.2013


คำตอบ (1)


คุณต้องทำ sc.nextLine() ในบล็อก catch เพื่อล้างอินพุตที่ผิดพลาด การเรียก nextInt() จะปล่อยให้อินพุตอยู่ในบัฟเฟอร์หากไม่ตรงกับรูปแบบ int

person Russell Zahniser    schedule 01.07.2013
comment
นั่นช่วยได้จริงๆ :D ขอบคุณมาก! นั่นเป็นเรื่องยุ่งยาก - person Pedro Costa; 01.07.2013
comment
เคล็ดลับ: i เป็นบูลีนอยู่แล้ว ดังนั้นคุณจึงไม่ต้องการ (i == true) ใช้ while(i) แทน - person Fernando; 01.07.2013