我一直收到这个错误
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 + "'");
}
}
}
我经历了调试器,它完全归结了整个文件,然后在完成时给我一个错误。
答案 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())
围绕这一行,我认为你应该没问题。