3

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

该文件包含: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 等等?

4

3 回答 3

5

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!");  
    }

}

我已经尝试将所有内容都放入一个while循环中,并且它会随着输入异常而无休止地循环。

你提到你已经尝试过了。我需要有关您遇到的问题的更多详细信息,因为这是正确的方法。在我的脑海中,只是一个预感,也许 reader.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 点 32 分]

我对推进读者的看法是正确的。

根据扫描仪的 Java 文档:

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

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

于 2013-10-09T01:29:56.353 回答
2

将 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!");
    }  
}

编辑:请注意,此代码导致循环在导致 InputMismatchException 的第一行无限循环。请注意修复此错误的已接受答案。

于 2013-10-09T01:25:18.807 回答
1

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

        try {
            int num = reader.nextInt();
            System.out.println("Number read: " +num);
        } catch (InputMismatchException e) {
            System.out.println("Input error ");
        }
于 2013-10-09T01:30:11.690 回答