0

给定一个 File 和一个 Scanner 对象,

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

以及这两个司空见惯的陈述:

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

我正在尝试在单个 if 语句子句中使用 Scanner/String 类逻辑语句,该语句在给定的匹配正则表达式下读取文件的第一行,例如:

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

然后在同一 if 语句子句中调用适当的 Scanner/String 类方法以读取第二行和后续行/可接受的行。我已经上下阅读了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)。当心。如果text.hasNext()计算结果为真,这并不意味着text.nextLine()它将是非空的。

于 2012-10-19T18:40:48.680 回答
1

我看到两个问题:

  1. 当您执行if条件时, text.nextLine()可能不可用。

  2. 如果你的意思是说,当任何 currentLine 匹配 + 任何 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 回答