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分編集]

私は読者を前進させることについて正しいです。

Scanner の 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 ループは停止しています。対応する catch ブロックを while ループに移動します。あなたのコード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 に答える