1

私のプログラムは .txt ファイルを読み込んで Arraylist に保存する必要があります。

しかし、 readLine() は A 、 B を終了した後に読み取りを停止し、エラーを取得しました (空白行を読み取ると、すべてが NULL を返し、アウトバウンド例外が発生しました)

.txt ファイル

A B

D E

空行を読み飛ばして読み直し、空行を検出して読み飛ばすことは可能でしょうか.......

    public static void loadData(){
    try{
        BufferedReader rd = new BufferedReader (new FileReader("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt"));

    while(true){

        String myLine = rd.readLine();
        String fName = myLine.substring(0,myLine.indexOf("->",0));
        String toName = myLine.substring(myLine.indexOf("->")+3);

        if(!myMap.containsKey(fName)){
           ArrayList<String> myArray = new ArrayList<String>();
           myMap.put(fName,myArray); 
        }
        myMap.get(fName).add(toName);
        allPlaces.add(fName);

        if(rd.readLine()== null) { myLine = rd.readLine();
       }
    }
    }

    catch(IOException ex){
        throw new ErrorException(ex);
    }
}
4

4 に答える 4

3

Scannerで試してください。それはずっと簡単です:

Scanner scanner = new Scanner(new File("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt");
while (scanner.hasNextLine()) {
  String line = scanner.nextLine();
  if (!line.equals("")) {
    //do stuff with the line since it isn't blank
}

このようにして、ファイルの最後まで読み続け、空白ではない行だけを処理します。

line.replaceAll("\\s+", "");また、空白行が本当に空白であり、他の空白文字が含まれていないことを確認するなどの方法で行を実行することを検討することもできます。

于 2013-10-20T04:19:41.023 に答える
2

Java には「空行」はありません。readLine()返された場合はnull、ストリームの終わりを意味します。これは、呼び出すたびに確認する必要があり、それを取得した場合は、ストリームを閉じて読み取りを停止します。ループは次のようになります。

while ((line = in.readLine()) != null)
{
    // ...
}
in.close();

「アウトバウンド例外」などもありません。ArrayIndexOutOfBoundsException?それとも_NullPointerException?

于 2013-10-20T04:20:57.407 に答える
1

はい、可能です。しかし、あなたの例外はそれから来ていません。null が適用されているためindexOf()です (例外スタック トレースを参照してください。READ IT は、エラーを追跡できる貴重な情報源です)。readLine()不適切に使用します。これ:

if(rd.readLine()== null) { myLine = rd.readLine();
}

奇数行をすべて破棄します。を呼び出して null をチェックすることはできませんreadLine()。代わりに、ループ内で 1 回だけ呼び出しreadLine()て、その戻り値が null かどうかを確認する必要があります。null でない場合にのみ、さらに処理を行う必要があります。

于 2013-10-20T04:12:03.293 に答える
1

何かがnullであるため、例外が発生していません。でもこのラインのせいで

String fName = myLine.substring(0,myLine.indexOf("->",0));

asmyLine.indexOf("->",0)は -1 を返すため、substring メソッドは例外をスローします。このコードを変更して機能させます。

while(true) を使用しないでください。while ループが永遠に続きます。使用する

while(rd.readLine() != null)

代わりは。

于 2013-10-20T04:18:00.923 に答える