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

来自扫描器的用户输入导致try/Catch块中的无限循环,即使在Catch中使用NextLine时也是如此

公良鸿风
2023-03-14

如果输入了正确的文件名,就没有问题。如果输入了不正确的文件名,无限循环会不断告诉用户输入一个文件名。但它不会等待用户输入文件名。它在无限循环中不断处理第一个错误数据。我在catch块中使用nextLine,它应该清除错误的输入。还尝试了reset()。我做错了什么?

    public static String reader() {
    boolean fileCorrect = false;

    // Holds the data from the file and is returned.
    StringBuilder fromFile=new StringBuilder("");

    // Loop until the user enter's a filename that the system can find.
    do
    {
        System.out.println("\nEnter filename to open: ");

        //Try with resources to open Scanner object for keyboard input
        try (Scanner keyboard = new Scanner(System.in))
        {
            String fileName = keyboard.next();

            // Trim leading/trailing spaces from filename
            fileName = fileName.trim();

            // The file object opened with try below
            File iFile = new File(fileName);

            //Attempt to open the file, which is automatically closed by try with resources.
            try (Scanner fileInput = new Scanner(iFile))
            {
                //Read the file and append data to the string.
                while (fileInput.hasNextLine())
                {
                    fromFile = fromFile.append(fileInput.nextLine());
                }

                //If we make it this far, no need to loop.
                fileCorrect = true;
            }

            // Catch specific first, a child of IOException. Most likely to happen.
            catch (FileNotFoundException ex)
            {
                System.err.println(ex.getMessage() + ": File not found");
                //ex.printStackTrace();
                keyboard.nextLine();
             }

            // If the scanner somehow closed before data was read.
            catch (IllegalStateException ex)
            {
                System.err.println(ex.getMessage() + ": Error reading from file");
                //ex.printStackTrace();
                keyboard.nextLine();
            }

            // Something else went wrong. Generic catch-all to keep the program from crashing.
            catch (Exception ex)
            {
                System.err.println(ex.getMessage());
                //ex.printStackTrace();
                keyboard.nextLine();
            }

        }

        catch (Exception ex)
        {
            // handle these
        }
    }
    while (!fileCorrect);

共有1个答案

令狐翰
2023-03-14

将此扫描器键盘=新建扫描器(system.in);移到do-while循环之前

如果您将其作为try(扫描器键盘=new Scanner(System.In))-它将自动在System.in Scanner调用close,而Next将不起作用

如果您有正确异常处理程序

catch (Exception ex)
{
      ex.printStackTrace();
}

您将看到消息

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

  • 所以,我被这段代码困住了: 这是我的输出: 插入一个整数:< br >无效值!< br >插入一个整数:< br >无效值!< br >...

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

  • 问题内容: 好的,这可能是一个非常愚蠢的问题,但是我发现关于此的PHP文档以及一些Internet搜索并没有使我对此有所任何了解。 什么时候应该使用try-catch块来改进我的应用程序? 我读过有人说我们应该仅使用try- catch块来防止致命错误。我读过别人的话说,我们应该只在意外错误上使用它(等什么?意外?如果它们是意外错误,如何使用try- catch防止它们出现?我应该将所有应用程序代

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

  • 我开发了一个字符排序器,我想每次字符串排序后提示用户输入一个新的字符串。我遇到的问题是扫描仪一直在扫描用户的第一个输入。如果我使用scanner.next(),它不会计算输入末尾的空白,这不是解决方案。 这是while循环的开始。一旦代码完成,它将再次从“inputtext”开始。