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

异常处理,catch导致while循环停止

屠华辉
2023-03-14

我有一个文件,我需要读取,打印出整数,捕获异常并继续显示下一个整数,依此类推,直到没有更多的整数。

该文件包含:12 5 sd 67 4 cy

我想让它显示:

12
5
输入错误67
4
输入错误

但是,它只给我12,5,接着输入错误,它就停了。我尝试过将所有内容放入while循环中,但它会无休止地循环,并出现输入异常。

public static void readNumbers()
 {

    File inputFile = new File ("C:/users/AC/Desktop/input.txt");
     try
     {
         Scanner reader = new Scanner(inputFile);
         while(reader.hasNext())
         {
                int num = reader.nextInt();
                System.out.println("Number read: " +num);
            } 
      }
      catch (InputMismatchException e)
      {
                System.out.println("Input error ");
      }
      catch (FileNotFoundException e2)
      {
          System.out.println("File not found!");
      }    
  }

 }

我错过了什么,以便循环继续读取下一个int等等?

共有3个答案

鲜于德业
2023-03-14

当异常发生时,控制到达匹配的catch块,然后到达该catch块之后的后续行。在您的情况下,匹配的catch在当循环之外,因此当循环停止。将相应的catch块移动到当循环中。在您的代码reader.nextInt()中;是可能导致InputMismatchException的潜在行。

        try {
            int num = reader.nextInt();
            System.out.println("Number read: " +num);
        } catch (InputMismatchException e) {
            System.out.println("Input error ");
        }
松桐
2023-03-14

将try-catch放入循环中,如下所示:

public static void readNumbers()
{
    File inputFile = new File ("C:/users/AC/Desktop/input.txt");

    try
    {  
        Scanner reader = new Scanner(inputFile);
        while(reader.hasNext())
        {
            try
            {
                int num = reader.nextInt();
                System.out.println("Number read: " +num);
            }
            catch (InputMismatchException e)
            {
                System.out.println("Input error ");
            }
        }
    }
    catch (FileNotFoundException e2)
    {
        System.out.println("File not found!");
    }  
}

编辑:请注意,此代码会导致循环在第一行上无限循环,从而导致输入不匹配异常。注意:已接受修复此错误的答案。

龙俊美
2023-03-14

try/catch块需要位于循环内部。

当抛出异常时,控制将尽可能地中断,直到遇到一个catch块,在您的情况下,该块位于循环之外。

public static void readNumbers()
{

    File inputFile = new File ("C:/users/AC/Desktop/input.txt");
    try {
        Scanner reader = new Scanner(inputFile);
        while(reader.hasNext())
        {
            try
            {
                int num = reader.nextInt();
                System.out.println("Number read: " +num);
            }
            catch (InputMismatchException e)
            {
                System.out.println("Input error ");
            }
        }
    }
    catch (FileNotFoundException e2)
    {
        System.out.println("File not found!");  
    }

}

我尝试过将所有内容都放入time循环中,它会随着输入异常无休止地循环。

你提到你已经尝试过了。我需要有关您遇到的问题的更多详细信息,因为这是正确的方法。在我的头顶上,只是一种预感,也许read.nextInt()在发生异常时不会提高读者在文件中的位置,因此一次又一次地调用nextInt会读取相同的非整数块。

也许你的catch块需要调用reader.getSomethingElse?比如reader.next()?

这是一个想法,我还没有测试过:

public static void readNumbers()
{

    File inputFile = new File ("C:/users/AC/Desktop/input.txt");
    try {
        Scanner reader = new Scanner(inputFile);
        while(reader.hasNext())
        {
            try
            {
                int num = reader.nextInt();
                System.out.println("Number read: " +num);
            }
            catch (InputMismatchException e)
            {
                System.out.println("Input error ");
                reader.next();   // THIS LINE IS NEW
            }
        }
    }
    catch (FileNotFoundException e2)
    {
        System.out.println("File not found!");  
    }

}

[编辑9:32PM]

我对提高读者水平的看法是正确的。

根据扫描仪的Java文档:

将输入的下一个标记扫描为int。如果下一个标记无法转换为如下所述的有效int值,则此方法将抛出InputMismatchException。如果转换成功,扫描仪将前进超过匹配的输入。

http://docs.oracle.com/javase/7/docs/api/

 类似资料:
  • 问题内容: 我有一个文件需要读取,打印出整数,捕获异常并继续显示下一个整数,依此类推,直到不再有整数。 该文件包含:12 5 sd 67 4 cy 我希望它显示: 12 5 输入错误 67 4 输入错误 但是,它只给我12、5,后面是输入错误,然后停止。我尝试将所有内容放入while循环中,并且由于输入异常而无休止地循环。 我缺少什么,以便循环继续读取下一个int,依此类推? 问题答案: try

  • 问题内容: 该算法应将3个整数带入ArrayList。如果输入的不是整数,则将出现提示。当我执行代码时,该子句会执行,但是程序会陷入无限循环。有人可以指导我朝正确的方向前进,我感谢您的帮助。:-D 问题答案: 这是因为当使用下一个int读取并且失败时,仍然包含键入的内容。然后,当重新进入do- while循环时,尝试再次使用相同的内容对其进行解析。 您需要使用以下内容“冲洗” 内容: 笔记: 您可

  • 下面的代码询问用户他/她想要多少个赛车手。

  • 我试图处理一个用户输入,并允许只输入浮动。可以输入的浮点数是无限的,但是如果连续输入两个非浮点数,程序将结束。当程序结束时,它将打印所有数字的和。 问题是,每当我运行这个时,它立即运行while循环,将计数增加到2,并中断循环。在取消之前,您只能输入一个非浮点数。 编辑:正如你们中的一些人所指出的,count应该在while循环之前初始化

  • 问题内容: 我的问题很简短。我不明白为什么我的程序在捕获错误时会无限循环。我做了一个新的try- catch语句,但是它循环了,甚至复制,粘贴并修改了以前有效的程序中的适当变量。下面是语句本身,下面是整个程序。谢谢您的帮助! 程序: 问题答案: 您的程序将永远运行,因为在不更改扫描仪状态的情况下进行调用会一次又一次地引发异常:如果用户未输入,则调用不会更改扫描仪的外观,因此,当您在下一次迭代中进行

  • 问题内容: 我有这段代码。我想回到循环的起点,并再次要求用户输入。但是,它总是循环而不停止请求输入。我的代码有什么问题?谢谢 问题答案: 从http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29: “如果翻译成功,则扫描程序将前进经过匹配的输入。” 啊,但是如果翻译是什么 不是 成功的?在这种