1

説明するよりも、コードと出力を表示する方が簡単だと思います:)

これは私の主な方法からのものです:

//prompt user for filename
    System.out.println("Please enter the text file name. (Example: file.txt):");
    String filename = ""; //will be used to hold filename

   //loop until user enters valid file name
    valid = false;
    while(!valid)
    {
        filename = in.next();
        try
        {
            reader.checkIfValid(filename);
            valid = true; //file exists and contains text
        }
        catch (Exception e)
        {
            System.out.println(e + "\nPlease try again.");
        }
    }

そして、これは reader.checkIfValid メソッドです:

public void checkIfValid(String filename) throws InvalidFileException, FileNotFoundException
{
    try
    {
        in = new Scanner(new File(filename));

        if (!in.hasNextLine()) // can't read first line
            throw new InvalidFileException("File contains no readable text.");
    }
    finally
    {
        in.close();
    }
}

これは、存在しないファイルが入力されたときに得られる出力です。

テキストファイル名を入力してください。(例: file.txt):

doesNotExist.txt

java.lang.NullPointerException

もう一度やり直してください。

System.out.println(e) が NullPointerException を取得するのはなぜですか? 空のファイルまたはテキストを含むファイルを入力すると、問題なく動作します。空のファイルには、InvalidFileException (カスタム例外) メッセージが出力されます。

"in = new Scanner(new File(filename));" の周りに try-catch ステートメントを配置し、catch ブロックに例外を表示させると FileNotFoundException が出力され、その後に NullPointerException (I'm例外が checkIfValid メソッドで既にキャッチされている場合に、メイン メソッドの catch ブロックがアクティブになる理由が完全にはわかりません...)。

私はこれにしばらく費やしましたが、何が問題なのか完全にわかりません。どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

3

編集: null ポインターはリーダーへの呼び出しから来ていると思います。例外がどこから来たのかわからなくなったため、すべての例外をキャッチするのはお粗末です!

おそらく、checkIfValid メソッドは、ファイル名が有効かどうかを確認する必要がありますか?

public boolean checkIfValid(String filename) {
    try {
        File file = new File(filename);
        return file.exists();   
    } catch (FileNotFoundException) {
        System.out.println("Invalid filename ["+filename+"] "+e);
    }
}

次に、それを呼び出すコードは次のようになります。

filename = in.next();
valid = reader.checkIfValid(filename);
if (valid)
    List<String> fileContents = readFromFile(filename);

次に、このような独自のメソッドにすべてのファイル読み取りロジックを含めます。

public List<String> readFromFile(filename) {
    List<String> fileContents = new ArrayList<String>();
    try {
        in = new Scanner(new File(filename));
        while (in.hasNextLine()) {
            fileContents.add(in.nextLine);
        }
    } catch (IOException e){
        //do something with the exception
    } finally {
        in.close();
    }
    return fileContents;        
}
于 2012-12-03T02:22:02.090 に答える
-1

私の間違いは私だけが見ることができたものでした。私はすべての例外をキャッチしていたので、それがどこから来ているのかわかりませんでした。助けてくれてありがとう!

于 2012-12-03T03:40:50.947 に答える