2

特定のテキスト ファイル内の単語、音節、文の数を計算するプログラムを作成しています。これらの数字を見つけるのに助けは必要ありませんが、ファイル名を正しく入力しても、私のプログラム (現在はテキスト ファイル内の単語数のみを見つける必要があります) はテキスト ファイルをインポートしません。テキスト ファイルは、ソース コードと同じフォルダーにあります。代わりに、入力したファイルの拡張子が間違っていることが毎回通知され (catch{} を参照)、null ポインターがスローされます。何が原因なのか途方に暮れています。助言がありますか?

import java.io.*;
import java.util.*;

public class Reading_Lvl_Calc {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int words = 0;
        String fileName;
        Scanner scan;
        Scanner keyread = new Scanner(System.in);
        System.out.println("Please enter a file name (or QUIT to exit)");
        fileName = keyread.nextLine();
        File doc = new File(fileName);
        //while(scan.equals(null)){
        try
        {   
            scan = new Scanner(doc);
        }
        catch(Exception e)
        {   
            if(fileName.substring(fileName.indexOf(".")) != ".txt")
            System.out.println("I'm sorry, the file \"" + fileName + "\" has an invalid file extension.");
            else 
            System.out.println("I am sorry, the file \"" + fileName + " \" cannot be found.\n The file must be in the same directory as this program");
            scan = null;
        }
    //  }
        while(scan.hasNext()){
            words++;
            scan.next();
        }
        System.out.println(words);

    }

}
4

7 に答える 7

4

あなたのキャッチは を設定scan = nullし、次の行(キャッチの外側)で使用しますscan.hasNext()-キャッチを通過した場合、スキャンがnullであることがわかっているため、これによりNullPointerExceptionが発生します。

おそらく例外を再スローするか、null スキャナーに対処できるようにコードを堅牢にする (つまり、何もしない) 必要があります。

于 2012-11-03T04:22:27.517 に答える
1

これを試して...

try{   
    scan = new Scanner(doc);
}catch(Exception e){   
    e.printStackTrace();
}

初期化の問題を確認しScannerます。

于 2012-11-03T04:56:40.103 に答える
1

比較のために、演算子を equal() に置き換えます。

        if(fileName.substring(fileName.indexOf(".")) != ".txt")
    to
        if((fileName.substring(fileName.indexOf("."))).equals(".txt"))  

上記の while 条件では、スキャン obj が null かどうかを確認してから、スキャン obj を反復できます.....

if(scan != null){
    while(scan.hasNext()){
        words++;
        scan.next();
    }
}
于 2012-11-03T11:48:15.440 に答える
0

スキャナの作成が失敗した場合、スキャナ関連の処理を行う意味がないため、すべてのスキャナ コードを try ブロックに配置し、いくつかのエラー メッセージを catch ブロックに配置する必要があります。スキャナーの作成に進む前に、ファイル名のチェックを行う必要があります。

    try
    {   
        scan = new Scanner(doc);
        while(scan.hasNext())
        {
            words++;
            scan.next();
        }
        System.out.println(words);
    }
    catch(Exception e)
    {
        System.out.println("Scanner creation failure:" + e.getMessage());
    }
于 2012-11-03T12:15:42.280 に答える
0

オブジェクト変数の実際の値はメモリアドレスであり、オブジェクトは参照によって比較されるため、オブジェクト(文字列など)で「==」および「!=」演算子を使用することは一般的に悪い考えです。望ましい効果: fileName.substring(fileName.indexOf(".")) と ".txt" がメモリ内の同じ場所を共有しているかどうかは気にしません (共有しません)。値で比較するには、代わりに .equals() を使用します。そうしないと、テストは常に false を返し、if ステートメントは役に立たなくなります。

于 2012-11-03T05:22:35.397 に答える