0

FileオブジェクトとScannerオブジェクトが与えられた場合、

File simpleFile = ranFi.getSelectedFile();
Scanner text = new Scanner(simpleFile);

そしてこれらの2つのありふれた声明:

    while(text.hasNext())
    {
        String currentLine = text.nextLine();

単一のif-statement句でScanner/Stringクラスの論理ステートメントを使用しようとしています。この句は、次のような特定の一致する正規表現の下でファイルの最初の行を読み取ります。

String fp100 = "[S][:][A-Ze0-1]";
String fp200 = "[S][:][A-Z0-1][A-Z0-1]";
//other regexes…

次に、同じif-statement句で適切なScanner / Stringクラスのメソッドを呼び出して、2行目以降/許容可能な行を読み取ります。javadocを上下に読んだことがありますが、まだ理解していません。currentLine.matches(regex)とtext.nextLine()。matches(regex)を使用して、このコードをコンパイルし、

    if(currentLine.matches(fp100)||currentLine.matches(fp200)||
       currentLine.matches(fp300) && text.nextLine().matches(fp100)||
       text.nextLine().matches(fp101) || text.nextLine().matches(fp200)||
       text.nextLine().matches(fp201) || text.nextLine().matches(fp300)||
       text.nextLine().matches(fp301))
    {

ただし、そのような要素なしの例外はすぐにスローされます。私は何が間違っているのですか?よろしくお願いします。編集:スタックトレースを含めましたが、これはプロジェクトに関連しているため、ソースコードを削除しました。

スタックトレース

4

2 に答える 2

1

while(text.hasNextLine())ループ内で使用している場合は、whileループを最初に使用する必要がtext.nextLine().matches(regex)あります。気をつけて。trueと評価された場合、それがnull以外になるtext.hasNext()という意味ではありません。text.nextLine()

于 2012-10-19T18:40:48.680 に答える
1

2つの問題があります。

  1. if条件 を実行すると、text.nextLine()使用できない場合があります。

  2. つまり、currentLineMatchesのいずれか+nextLineのいずれかがtrueとして一致する場合は、ifを実行し、||引数を次のように中括弧で囲みます。

    if((currentLine.matches(fp100)||currentLine.matches(fp200)||
       currentLine.matches(fp300)) && 
       (text.nextLine().matches(fp100)||
        text.nextLine().matches(fp101) || text.nextLine().matches(fp200)||
        text.nextLine().matches(fp201) || text.nextLine().matches(fp300)||
        text.nextLine().matches(fp301)))
    

whileループを次のように記述したいと思います。

        while(text.hasNextLine()){
           String currentLine = text.nextLine();
           String nextLine = "";
           if(text.hasNextLine())[
               nextLine  = text.nextLine();
           }

           /**ACC conditions*/
           if((currentLine.matches(fp100)||currentLine.matches(fp200)
                || currentLine.matches(fp300)) 
                && (nextLine.matches(fp100)|| nextLine.matches(fp101) 
                     || nextLine.matches(fp200)
                     || nextLine.matches(fp201) || nextLine.matches(fp300)
                     || nextLine.matches(fp301)) {
                                //current line is OK
                                System.out.println(currentLine);
                                output.write(currentLine);
                                output.write("\n");
                                abc1List.add(currentLine);
                                lineOK++;               

                                //next line is OK
                                System.out.println(nextLine);
                                output.write(nextLine);
                                output.write("\n");
                                abc1List.add(nextLine);
                                // <-- not sure if you want OK as 1 or 2 here 
                                lineOK++;           
           } /**REJ conditions*/
           else if(!currentLine.matches(fp100)||!currentLine.matches(fp101)||
                  !currentLine.matches(fp200)||!currentLine.matches(fp201)||
                  !currentLine.matches(fp300)||!currentLine.matches(fp301)){   
                        System.out.println("invalid cfg; terminating....");
                   System.exit(0);
           }
       }//end of while
于 2012-10-19T18:44:51.520 に答える