java.util.NoSuchElementException:找不到行*

时间:2014-11-03 05:15:37

标签: java nosuchelementexception

我一直收到这个错误 java.util.NoSuchElementException找不到行 当我使用这种方法时

public boolean hasMoreCommands() {
    if (input.hasNextLine()) {
        return true;
    } else {
        //input.close();
        return false;
    }
}

public void advance() {
    String str;
    if(hasMoreCommands() == true){
        do {
            str = input.nextLine().trim();

            // Strip out any comments
            if (str.contains("//")) {
                str = (str.substring(0, str.indexOf("//"))).trim();
            }
        } while (str.startsWith("//") || str.isEmpty() || hasMoreCommands());
        command = str;
  }
}

我的主要代码在这里:

public class Ptest
{
  public Ptest(String fileName)
  {
    String line = null;
    String nName = fileName.replace(".vm", ".asm");
    Parser p = new Parser();

    try{ 
        File neF = new File(nName);
        if(!neF.exists()){
            neF.createNewFile();
        }
        File tempFile = new File("temp.txt");
        if(!tempFile.exists()){
            tempFile.createNewFile();
        }

        FileReader fr = new FileReader(fileName);
        BufferedReader br = new BufferedReader(fr);
        FileWriter fw = new FileWriter(nName);
        BufferedWriter bw = new BufferedWriter(fw);
        FileWriter writR = new FileWriter(tempFile);
        BufferedWriter buffR = new BufferedWriter(writR);
        while((line = br.readLine()) != null) {
            buffR.write(line+ "\n");
            //System.out.println(line);
        }  
        buffR.flush();
        buffR.close();
        p.insertTitle(tempFile);
        String ctype = p.commandType();
        int len = ctype.length();
        int spaces = 13 - len;
        String sp = " ";
        String asp = " ";
        String a1 = null;
        int a2;
        int alen;
        boolean t = false;
        while(p.hasMoreCommands()){
            for(int i= 0; i < spaces; i++){
                sp += " ";
            }
            t = p.hasMoreCommands();
            a1 = p.arg1();
            alen = (10 - a1.length());
            for(int i= 0; i < alen; i++){
                asp += " ";
            }
            //a2 = p.arg2();
            if (ctype == "C_PUSH" || ctype == "C_POP" || ctype == "C_FUNCTION" || ctype == "C_CALL") {
                a2 = p.arg2(); 
                bw.write(ctype + sp + a1 + asp + a2);
            }
            else {
                bw.write(ctype + sp + a1);
            }
            p.advance();
            ctype = p.commandType();
            len = ctype.length();
            spaces = 13 - len;
        }

        bw.flush();
        bw.close();
    }
    catch(FileNotFoundException ex){
        System.out.println("File not found!");
    }
    catch(IOException ex){
        System.out.println("Error reading file '"  + fileName + "'");
    }
  }
}

我经历了调试器,它完全归结了整个文件,然后在完成时给我一个错误。

2 个答案:

答案 0 :(得分:1)

与@hfontanez一样,我认为您的问题出在此代码中:

if(hasMoreCommands() == true){
    do {
        str = input.nextLine().trim();

        // Strip out any comments
        if (str.contains("//")) {
            str = (str.substring(0, str.indexOf("//"))).trim();
        }
    } while (str.startsWith("//") || str.isEmpty() || hasMoreCommands());
    command = str;
}

但是,我的解决方案是将while子句更改为while (str.isEmpty() && hasMoreCommands());

我假设&#34;提前&#34;应该返回下一个非评论/空白行。

如果前一个传递的字符串为空(在删除任何注释之后),如果不是最后一行,它将再次循环。但是,如果那是最后一行或者str仍然有一些东西,那么它将退出循环。评论应该被删除,因此不需要进行测试。

我认为如果您只是在循环中测试hasNextLine,那么如果最后一行是注释/空白,它将永远不会退出循环。

答案 1 :(得分:0)

我的猜测是你的问题在这里:

if(hasMoreCommands() == true){
    do {
        str = input.nextLine().trim();

        // Strip out any comments
        if (str.contains("//")) {
            str = (str.substring(0, str.indexOf("//"))).trim();
        }
    } while (str.startsWith("//") || str.isEmpty() || hasMoreCommands());
    command = str;
}

您遇到的异常(NoSuchElementException)通常发生在有人试图迭代某些东西(字符串标记,地图等)而不先检查是否还有其他元素要获取的情况下。第一次执行上面的代码时,它会检查它是否有更多命令,然后它进入循环。第一次它应该工作正常,但是,如果while()完成的测试成功,下一次迭代将在尝试执行input.nextLine()时爆炸。在调用此方法之前,您必须检查是否有下一行。用if(input.hasNextLine())围绕这一行,我认为你应该没问题。