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

try/catch无限循环?[复制]

钱振
2023-03-14

帮助,我对java完全陌生,我正在尝试创建一个循环,该循环将要求用户输入一个数字。如果用户输入的数字以外的任何内容,我想捕获异常并再次尝试获取正确的输入。我用一段时间循环完成了此操作,但是它不会在错误后为用户提供输入任何内容的机会,它循环了除该循环之外的所有内容。请帮助我了解什么是错的,以及正确的方法...谢谢。这就是我所拥有的:

    import java.util.Scanner;
    import java.util.InputMismatchException;

    public class simpleExpressions {
    public static void main (String[] args) {
      Scanner keyboard = new Scanner(System.in);

      while ( true ) {
        double numOne;
        System.out.println("Enter an Expression ");
        try {
          numOne = keyboard.nextInt();
          break;
        } catch (Exception E) {
          System.out.println("Please input a number only!");
        } //end catch
      } //end while
    } //end main

共有3个答案

费凯康
2023-03-14

在这种情况下,您可能希望使用do... time循环,因为您总是希望至少执行一次循环中的代码

int numOne;
boolean inputInvalid = true;
do {
    System.out.println("Enter an expression.");
    try {
        numOne = keyboard.nextInt();
        inputInvalid = false;
    } catch (InputMismatchException ime) {
        System.out.println("Please input a number only!");
        keyboard.next(); // consume invalid token
    }
} while(inputInvalid);
System.out.println("Number entered is " + numOne);

如果抛出异常,则< code>inputInvalid的值保持为真,循环继续进行。如果没有抛出异常,则< code>inputInvalid变为false,允许执行退出循环。

(根据此处其他答案提供的建议,添加了对Scanner Next()方法的调用以使用无效令牌。)

蒋俊
2023-03-14

使用< code > keyboard . next();或< code>keyboard.nextLine()来使用< code>nextInt中留下的无效标记。

当抛出InputMismatchException时,扫描仪不会移动到下一个令牌。相反,它让我们有机会使用不同的、更合适的方法来处理该令牌,例如:nextLong()nextDouble()nextBoolean()
但是如果您想移动到其他令牌,您需要让扫描仪毫无问题地读取它。要做到这一点,请使用可以接受任何数据的方法,例如Next()nextLine()。没有它,无效的令牌将不会被消耗,并且在另一次迭代中nextInt()将再次尝试处理相同的数据抛出InputMismatchException,导致无限循环。

有关代码中其他问题的详细信息,请参见@MarkoTopolnik答案。

臧兴学
2023-03-14
while ( true ) 
{
  double numOne;
  System.out.println("Enter an Expression ");
  try {
    numOne = keyboard.nextInt();
    break;
  }
  catch (Exception E) {
    System.out.println("Please input a number only!");
  }

这存在几个问题:

  • numOne 尚未提前初始化,因此在 try-catch 之后不会明确分配它,因此您将无法引用它;
  • 如果您计划在循环后使用numOne,则必须在循环范围之外声明它;
  • (你的直接问题)在异常之后,你不会调用sners.next(),因此你永远不会使用没有解析成int的无效令牌。这会使您的代码在第一次遇到无效输入时进入无限循环。
 类似资料:
  • 下面的代码询问用户他/她想要多少个赛车手。

  • 问题内容: 当我在 while循环中 使用 try和catch 块时,我的程序有一个无限 循环 。 当我输入一个整数时,它运行良好并要求另一个输入,但是当我输入一个字符时,它将进入无穷循环。为什么会这样呢? 问题答案: 遇到无效输入时,由于nextInt()不使用无效令牌,因此程序进入无限循环。因此,导致该异常的任何令牌都将保留在该位置,并在下次尝试使用nextInt()时继续引发异常。 可以通过

  • 问题内容: 我一直使我的代码陷入无限的while循环中。 没什么可提高的,但是我无法终生解决! 有人请帮忙 我有幸只是重新创建了特定的错误,而没有我实际程序中所有的if语句。 捕获输入不匹配异常时,将发生无限循环。我认为这至少会要求用户重新输入他们的输入,但与其这样做,不如继续这样做: 它的行为就像只是忽略扫描仪对象sc ?! 问题答案: 没有扫描程序不会被跳过,它只是从输入的开头开始。从Java

  • 我目前正在处理Eclipse中的一些Java代码,并试图在do-time语句中使用try捕获语句。我目前的代码如下: 当我输入任何数字时,代码工作正常,并将循环请求另一个输入,当输入10时,代码按预期停止(因为猜测值等于rand)。但是,如果我输入任何非整数的内容(例如“否”),则会出现一个无限循环,其中输出打印以下内容: "你的猜测必须是整数" “输入您的猜测:您的猜测必须是整数。” “输入您的

  • 问题是,如果我输入一个正数(所以一切都正确),我必须输入它两次!同样,当我输入一个负数时,我需要输入两次。当我输入一个字符串时,我会得到一个“错误”,所以我想这还算不错。它是这样显示的: Bitte geben Sie die kleinste阳性Zahl des Intervalls Ein:-2 -3 -7 Bitte Geben Sie eine阳性Zahl ein 2

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,