0

日付が含まれている可能性のあるファイルを解析しています。日付がある場合は、2 桁または 4 桁の年でフォーマットされますが、常にスラッシュが付きます (例: MM/DD/YY または MM/DD/YYYY)。

public class T2 {
    public static void main(String args[]) {
        inputLine = "foo foo foo foo foo 10/26/2013 bar bar bar bar bar";

        if(inputLine.indexOf("/")>0) {                       // if date exists
            taskDateSOF = (inputLine.indexOf("/")-2);        // then start of field is first instance of / minus two
            if (inputLine.lastIndexOf.isNumeric("/")+3); {         //    and if there's a number in the third position after the last /
                taskDateEOF = (inputLine.lastIndexOf("/") + 4);     //    the the end of date field is last instance of / +4
            else                                                  // <<< this "else" give an "else without if compiler error 
                taskDateEOF = (inputLine.lastIndexOf(("/" + 2)));      // else it's the last instance of / +2
                taskDate = inputLine.trim().substring(taskDateSOF,taskDateEOF).trim(); }  //
            }
        else                                            
             taskDate = "00/00/0000";
        }
            System.out.println(taskDate+" "+inputLine);
    }
}

少し苦労した後、私は以前にこのような if ステートメントをネストしたことがなく、エラーを解読するのに苦労していることに気付きました。else9 行目 (最初の行) で、else without ifコンパイル中にエラーが発生します。私が参照したサンプル コードとチュートリアルに基づくと、問題ないように見えますが、中かっこの位置がどこか間違っていると思われます。私は問題を見つけることができず、私の「試してみて何が起こるか見てみよう」という実験はどれも成功していません。誰かが私が見ていないものを教えてもらえますか?

4

4 に答える 4

7

これは最初からコンパイルされません:

if (inputLine.lastIndexOf.isNumeric("/")+3);

それはあらゆる点で間違っています - 私にはあなたの言いたいことがはっきりしませんlastIndexOfはメソッド呼び出しです - なぜフィールドのように使用しているのですか? 何に 3 を追加しようとしていますか? 条件が true と評価されるのはいつですか?

次に、if/else 構文が間違っています。通常、次を使用する必要があります。

if (condition) {
    // Code
} else {
    // Code
}

代わりに、次のものがあります。

if (condition); {
   // Code
else
   // Code
}

あなたが持っている余分なセミコロン悪いブレースに注意してください. ポイントは、次のように指定することです。

  • 一つの条件
  • 条件が真の場合に実行するコードのブロック
  • それ以外の場合に実行するコードのブロック

{ }単一のステートメントでない限り、これらのブロックはその中にある必要があります。

場合によってはブレースなしで済むこともありますが、通常は常にブレースを使用する方がよいでしょう。単一ステートメントの本体を複数ステートメントの本体に変更すると、エラーの余地が少なくなります。

于 2012-08-06T17:57:12.420 に答える
3

if ステートメントの条件の後にセミコロンがあり、if ステートメントの本体を効果的に終了させます。

if (inputLine.lastIndexOf.isNumeric("/")+3)/*;*/

また、inputLine とはどのようなオブジェクトでしょうか。型で宣言されていないようです。この場合、「lastIndexOf」というフィールドはありません。

if-without-else は、コードに関するいくつかの問題の 1 つです。Java 構文を学習するには、他のコード例を参照することをお勧めします。

于 2012-08-06T17:55:02.623 に答える
0

@theglauberが言ったように、そのような種類の入力を正規表現で解析する方がはるかに簡単に見えます.

String inputLine = "foo foo foo foo foo 10/26/2013 bar bar bar bar bar";
Pattern p = Pattern.compile(".*(\\d{2}\\/\\d{2}\\/\\d{4}).*");
Matcher m = p.matcher(inputLine);
if (m.matches()) {
    String taskDate = m.group(1);
    System.out.println(taskDate + " " + inputLine);
}

さらに、このif-then if-then-else Java チュートリアルが役立つかもしれません。正規表現を使用する場合は、これを読んでください。

于 2012-08-06T18:22:13.743 に答える
0

良い。余分なセミコロンを除いて、コードに中括弧がありません。次のようになります。

if (inputLine.lastIndexOf.isNumeric("/")+3); {         //    and if there's a number in the third position after the last /
    taskDateEOF = (inputLine.lastIndexOf("/") + 4);     //    the the end of date field is last instance of / +4
else                                                  // <<< this "else" give an "else without if compiler error 
    taskDateEOF = (inputLine.lastIndexOf(("/" + 2)));      // else it's the last instance of / +2
    taskDate = inputLine.trim().substring(taskDateSOF,taskDateEOF).trim(); }  //
}

これが必要な場合:

if (inputLine.lastIndexOf.isNumeric("/")+3) {         //    and if there's a number in the third position after the last /
    taskDateEOF = (inputLine.lastIndexOf("/") + 4);     //    the the end of date field is last instance of / +4
} else {                                                  // <<< this "else" give an "else without if compiler error 
    taskDateEOF = (inputLine.lastIndexOf(("/" + 2)));      // else it's the last instance of / +2
    taskDate = inputLine.trim().substring(taskDateSOF,taskDateEOF).trim();  //
}

中括弧または括弧が閉じていないかどうかを確認する 1 つの方法は、テキスト エディター (Notepad++ など) または IDE (Netbeans など) を使用して、開いている中括弧が終了する場所を強調表示することです。しかし、正直なところ、Java プログラミングの基本的な理解が不足しているように見えるので、言語に関する本 (Deitel の How to program など) を読んで基本を理解することをお勧めします。

于 2012-08-06T18:37:26.350 に答える