0

ファイルからいくつかの数値を読み取る小さなアプリケーションをいじっています。これまでのところすべてうまくいっていますが、問題が発生しました。効果的に修正する方法がわかりません。ユーザーが誤って間違ったファイル名を入力すると、FileNotFoundException が JVM によってスローされ、呼び出しメソッドでキャッチします。今、私は彼(ユーザー)に正しいファイル名を入力するためにもう一度2回試してもらいたいのですが、実際にキャッチブロックにいるときにファイルを開くメソッドを再度呼び出す方法がわかりません。以下に一時的な解決策を示しますが、これがこの問題を解決するための最も効果的/エレガントな方法であるかどうかはわかりません。

//code omitted
            int temp = 0;

        while(true) {
            filename = input.next();

            try {
                ex.fileOpen(filename);
            }
            catch(FileNotFoundException e) {
                if(temp++ == 3) {
                    System.err.println("You have entered the filename three times consecutively wrongly");
                    return;
                }
                continue;
            }
            break;
        }
//do some other stuff

input は、ユーザー入力を読み取り、それを文字列変数のファイル名に割り当てるスキャナーです。fileOpen は、ファイル名を受け取り、ファイルを開き、コンテンツを読み取り、すべての数値をベクトルに書き込むメソッドです。

したがって、経験豊富な Java プログラマーからのすべてのサポートに本当に感謝しています。

こんにちはトム

4

6 に答える 6

1

メソッドを再帰的に再度呼び出したい場合があります。

  public void doTheStuff(int attemptsLeft)
      // ...
      if (attemptsLeft == 0) {
         System.err.println("You have entered the filename three times consecutively wrongly");
         return;
      }
      filename = input.next();
      try {
          ex.fileOpen(filename);
      }
      catch(FileNotFoundException e) {
          doTheStuff(attemptsLeft - 1);
          return;
      }
      // ...
  }

次に、単に呼び出しますdoTheStuff(3)

于 2013-07-17T21:45:56.267 に答える
0

このようなもの(実行可能ではなく、疑似コード)はどうですか?

// ...
    for(int i = 0; i < 3; i++)
    {
        // User interaction to get the filename

        if(attemptToOpenFile(ex))
        {
            break;
        }
    }
    // Check if the file is open here and handle appropriately.
// ...
}

bool attemptToOpenFile(File ex, String filename) { // Forgot the class name for this
    try {
        ex.fileOpen(filename);
        return true;
    } catch(FileNotFoundException e) {
        return false;
    }
}

または、fileOpen() を呼び出す前にファイルが存在するかどうかを確認します。

于 2013-07-17T21:52:33.443 に答える