0

我正在解析一个可能包含日期的文件。如果日期在那里,它的格式是两位数或四位数的年份,但总是带有斜线(例如,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 到什么?您希望条件何时评估为真?

那么你的 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 是您的代码存在的几个问题之一。我建议查看其他代码示例来学习 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();  //
}

了解您是否有未闭合的花括号或括号的一种方法是使用文本编辑器(如 Notepad++)或 IDE(如 Netbeans)来突出显示打开的花括号结束的位置。但老实说,您似乎缺乏对 Java 编程的基本了解,因此我建议您阅读有关该语言的书籍(例如 Deitel 的如何编程或类似书籍)以了解它的基础知识。

于 2012-08-06T18:37:26.350 回答