5

どのように try/catch ステートメントをループしますか? スキャナーを使用してファイルを読み取り、キーボードから読み取るプログラムを作成しています。だから私が望むのは、ファイルが存在しない場合、プログラムは「このファイルは存在しません。もう一度やり直してください」と言うでしょう。次に、ユーザーに別のファイル名を入力してもらいます。これを行うためにいくつかの異なる方法を試しましたが、私の試みはすべてプログラムのクラッシュに終わります。

これが私が持っているものです

    try {
        System.out.println("Please enter the name of the file: ");
        Scanner in = new Scanner(System.in);
        File file = new File(in.next());
        Scanner scan =  new Scanner(file);
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("File does not exist please try again. ");
    }
4

5 に答える 5

11

失敗後に再試行する場合は、そのコードをループ内に配置する必要があります。たとえば、次のようなものです。

boolean done = false;
while (!done) {
    try {
        ...
        done = true;
    } catch (...) {
    }
}

(do-while はもう少しエレガントなソリューションです。)

Exceptionただし、このコンテキストでキャッチするのは悪い習慣です。発生すると予想される例外 (例: IOException) だけでなくNullPointerException、プログラムのバグの兆候である予期しない例外などもキャッチします。

ベスト プラクティスは、予期している (そして処理できる) 例外をキャッチし、他の例外を伝播できるようにすることです。あなたの特定のケースでは、キャッチFileNotFoundExceptionで十分です。(これはScanner(File)コンストラクターが宣言するものです。) 入力に a を使用していない場合は、代わりScannerに catch が必要になる場合があります。IOException


上位投票の回答の重大な間違いを修正する必要があります。

do {
    ....
} while (!file.exists());

ファイルが存在することをテストするだけでは不十分なため、これは正しくありません。

  • ファイルは存在する可能性がありますが、ユーザーにはそれを読み取る権限がありません。
  • ファイルが存在する可能性がありますが、ディレクトリである場合、
  • ファイルが存在する可能性がありますが、ハードディスクのエラーなどにより開くことができません
  • exists()テストが成功してから次にファイルを開こうとするまでの間に、ファイルが削除/リンク解除/名前変更される可能性があります。

ご了承ください:

  1. File.exists()ファイル システム オブジェクトが指定されたパスに存在することのみをテストします。実際にファイルであること、またはユーザーが読み取りまたは書き込みアクセス権を持っていることはテストしません。
  2. ハード ディスク エラーやネットワーク ドライブ エラーなどによって I/O 操作が失敗するどうかをテストする方法はありません。
  3. オープンと削除済み/リンク解除済み/名前変更済みの競合状態に対する解決策はありません。通常の使用ではめったに発生しませんが、問題のファイルがセキュリティ クリティカルである場合、この種のバグが標的になる可能性があります。

正しいアプローチは、単にファイルを開こうとし、それが発生したIOException場合にキャッチして処理することです。それはよりシンプルでより堅牢で、おそらくより高速です。そして、「通常のフロー制御」に例外を使用すべきではないと言う人にとって、これ通常のフロー制御ではありません...

于 2012-09-02T04:51:02.593 に答える
7

try catch ブロックを使用する代わりにdo while、ファイルが存在するかどうかを確認するループを試してください。

do {

} while ( !file.exists() );

このメソッドはjava.io.File

于 2012-09-02T04:50:51.033 に答える
1

単純にループでラップできます。

while(...){

    try{

    } catch(Exception e) {

    }

}

ただし、すべての例外をキャッチし、ファイルが存在しないことが原因であると想定することは、おそらく最善の方法ではありません。

于 2012-09-02T04:50:56.400 に答える
1

次のようなことを試してください:

boolean success = false;

while (!success)
{
    try {
        System.out.println("Please enter the name of the file: ");
        Scanner in = new Scanner(System.in);
        File file = new File(in.next());
        Scanner scan =  new Scanner(file);
        success = true;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("File does not exist please try again. ");
    }
}
于 2012-09-02T04:51:36.360 に答える
0

API を使用してファイルが存在するかどうかを確認します。

String filename = "";

while(!(new File(filename)).exists())
{
    if(!filename.equals("")) System.out.println("This file does not exist.");
    System.out.println("Please enter the name of the file: ");
    Scanner in = new Scanner(System.in);
    filename = new String(in.next();        
}
File file = new File(filename);
Scanner scan =  new Scanner(file);
于 2012-09-02T05:07:13.020 に答える