我有以下代码来计算文件中用户定义的标识符的数量(例如,用户定义的变量和方法)。所以它需要跳过诸如" main","如果"等等...等标记。
然而,当我运行以下程序时,我得到一个"没有这样的元素异常"在第30行(我称之为regexChecker()方法)。这是我的代码。
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class A1_104623455 {
private static int idCount = 0;
private static ArrayList<String> ids = new ArrayList<String>();
private static ArrayList<String> identifierCnt = new ArrayList<String>();
private static File file = new File("A11-input.txt");
private static File file2 = new File("A11-output.txt");
private static Scanner s;
private static PrintWriter pw;
public static void main (String args[]) {
try {
s = new Scanner(file);
pw = new PrintWriter(file2);
StringTokenizer st;
while(s.hasNext()) {
st = new StringTokenizer(s.nextLine());
while(st.hasMoreTokens()) {
str = st.nextToken();
if(!str.equals("int") && !str.equals("main") &&
!str.equals("printf") && !str.equals("return") &&
!str.equals("%d")) {
regexChecker("[A-Za-z_][A-Z-a-z_0-9]*", st.nextToken());
}
}
}
System.out.println("\n" + ids.size() + " valid identifiers");
pw.print("\n" + ids.size() + " valid identifiers");
pw.close();
}
catch(IOException e) {
System.out.println("file not found");
}
}
public static void regexChecker(String regex, String str) {
Pattern pattern = Pattern.compile(regex);
Matcher regexMatcher = pattern.matcher(str);
if(regexMatcher.find()) {
if(!ids.contains(regexMatcher.group())) {
System.out.println(regexMatcher.group());
ids.add(regexMatcher.group());
pw.print(regexMatcher.group() + "\n");
}
}
}
}
如果我取出包含regexpChecker()的if语句,程序就可以运行。我不确定导致此错误的原因。
我非常感谢你的帮助。
感谢。
编辑:
这是我正在测试的A11-input.txt文件的内容
int main(){
int number = 7;
if( number%2 == 0 )
printf("%d is an even integer.",number);
else
printf("%d is an odd integer.",number);
return 0;
}
答案 0 :(得分:2)
问题是在while块中,nextToken()方法被调用两次。所以在最后一次迭代中,它会被抛出一个NoSuchElement异常。
while(st.hasMoreTokens()) {
str = st.nextToken();
if(!str.equals("int") && !str.equals("main") &&
!str.equals("printf") && !str.equals("return") &&
!str.equals("%d")) {
regexChecker("[A-Za-z_][A-Z-a-z_0-9]*", st.nextToken());
}
}