【问题标题】:how to re-try/catch input mismatch exception without getting caught by infinite loop如何在不被无限循环捕获的情况下重试/捕获输入不匹配异常
【发布时间】:2018-10-20 10:24:15
【问题描述】:

我正在尝试从用户那里获取输入来为 2d 地雷的哭泣游戏构建网格, 当我将有效值传递给扫描仪时,该过程非常顺利,但是当我尝试无效的事情时,它会经历无限循环,即使尝试块尝试使用资源,每次新的尝试都应该关闭扫描仪,听起来它没有当它无限打印捕获的字符串时关闭它

int gridSize = 0;
    System.out.println("how much do you want the grid's size");
    try (Scanner scanner = new Scanner(System.in)) {
        while (gridSize == 0) {
            gridSize = scanner.nextInt();
            scanner.next();
        }
    } catch (NoSuchElementException e) {
        System.out.println("try again");
    }

【问题讨论】:

  • 你永远不需要捕捉NoSuchElementException,因为你应该在调用nextInt()之前使用scanner.hasNextInt()来检查令牌。
  • 当下一个令牌不是int 令牌时,您需要通过调用next()nextLine() 来丢弃该令牌。
  • 使用资源的尝试不应该关闭它吗?
  • 我指的是 catch (NoSuchElementException e),而不是 try-with-resources 部分。但要回答这个问题,一般来说,不,您不应该关闭包装 System.inScanner,因为关闭 System.in 不是您的责任,关闭它通常会导致错误。
  • 如何使用Scanner#hasNextInt 来检查输入是否是您期望的格式?

标签: java exception java.util.scanner


【解决方案1】:

您捕获了错误的异常 - 如果输入不是 int,则会抛出 InputMismatchException。但无论如何,使用hasNextInt() 可以使这更容易:

try (Scanner scanner = new Scanner(System.in)) {
    while (!scanner.hasNextInt()) {
        System.err.println("Try again, this time with a proper int");
        scanner.next();
    }
    gridSize = scanner.nextInt();
} 

【讨论】:

  • 是的,它很顺利,但不应该是一个 catch 块
  • @همامبابيخوجة No. hashNextInt() 如果您输入的不是int,则只会返回false。无需捕获异常。
  • 我试过 while (!scanner.hasNextInt()||scanner.nextInt()>10) 确保输入小于 10,然后它运行良好,但需要输入两次
猜你喜欢
  • 2016-05-30
  • 2015-07-07
  • 2019-06-22
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多