【问题标题】:Do - while goes into an infinite loopDo - while 进入无限循环
【发布时间】:2020-02-01 04:29:04
【问题描述】:

我正在尝试向此菜单添加输入验证。当用户输入 eg: 'a' 或任何非整数且具有给定范围的输入时,它必须执行 catch 块并再次循环以提示用户再次输入,但在输入一次后它会无限循环.所以它从执行菜单开始,只是跳过输入部分并执行 catch 块。

编辑:如果我输入任何不是整数的东西,它就会进入无限循环。

Scanner sc = new    Scanner(System.in);

int x = 1;

do{

try

{

System.out.println("Select option ");

System.out.println("1) Circle ");

System.out.println("2) Rectangle ");

System.out.println("3) Triangle ");

System.out.println("4) Exit ");

x = sc.nextInt();

}

catch(Exception e)

{

System.out.print("Invalid data");

}

}while(x<1 || x>4);

【问题讨论】:

  • 4 是退出,那么应该是&gt;= 4 吗?此外,nextInt 不会清除悬空的新行字符,而仍卡在缓冲区中(这是您问题的主要原因) - 您应该使用 nextLine,然后将结果解析为 int
  • 嗨,我很新。你能告诉我如何解析它吗?
  • 我可以在执行 catch 块后以某种方式清除输入吗?那行得通吗?是否有清除输入的方法或东西?
  • 就个人而言,我会使用sc.nextLine();,它会返回一个String,然后使用Integer.parseInt(valueFromScanner) 来解析结果
  • 我确实尝试过 { System.out.print("Enter"); x = sc.nextInt(); sc.nextLine(); Integer.parseInt(x);它给了我以下错误 Main.java:17: 错误:不兼容的类型:int 无法转换为 String

标签: java loops try-catch infinite-loop do-while


【解决方案1】:

问题是当扫描器获取字符/字符串而不是 int 时,您没有刷新缓冲区。此外,如果在第一次迭代中读入字符/字符串,您的循环将终止,因为您的循环条件将返回 false,x 最初设置为 1。您可以通过将其设置为 -1 来解决此问题。此外,您可以使用 hasNextInt() 方法来检查用户是否正在输入 int,而不是使用 try catch 块。

Scanner sc = new Scanner(System.in);

int x = -1;
do {
    System.out.println("Select option ");   
    System.out.println("1) Circle ");
    System.out.println("2) Rectangle ");
    System.out.println("3) Triangle ");
    System.out.println("4) Exit ");

    if (sc.hasNextInt())
    {
        x = sc.nextInt();
    }
    else
    {
        System.out.println("Invalid input. Please try again.");

        // Flush the buffer
        sc.nextLine();
    }
} while (x < 1 || x > 4);

sc.close();

【讨论】:

    【解决方案2】:

    sc.nextLine();

    下一个

    x = sc.nextInt();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2014-12-01
      • 2015-11-01
      相关资源
      最近更新 更多