我有这个Hash Set代码,当我尝试在其上运行我的编译方法时,我得到Null Pointer Exception:null错误。这是代码:
private void initKeywords() {
keywords = new HashSet<String>();
keywords.add("final");
keywords.add("int");
keywords.add("while");
keywords.add("if");
keywords.add("else");
keywords.add("print");
}
private boolean isIdent(String t) {
if (keywords.contains(t)) { ***//This is the line I get the Error***
return false;
}
else if (t != null && t.length() > 0 && Character.isLetter(t.charAt(0))) {
return true;
}
else {
return false;
}
}
伴随此错误的其他行是:
public void compileProgram() {
System.out.println("compiling " + filename);
while (theToken != null) {
if (equals(theToken, "int") || equals(theToken, "final")) {
compileDeclaration(true);
} else {
compileFunction(); //This line is giving an error with the above error
}
}
cs.emit(Machine.HALT);
isCompiled = true;
}
private void compileFunction() {
String fname = theToken;
int entryPoint = cs.getPos();
if (equals(fname, "main")) {
cs.setEntry(entryPoint);
}
if (isIdent(theToken)) theToken = t.token(); ***//This line is giving an error***
else t.error("expecting identifier, got " + theToken);
symTable.allocProc(fname,entryPoint);
accept("(");
compileParamList();
accept(")");
compileCompound(true);
if (equals(fname, "main")) cs.emit(Machine.HALT);
else cs.emit(Machine.RET);
}
答案 0 :(得分:2)
您确定在initKeywords()
之前正在运行isIdent()
吗?
答案 1 :(得分:0)
您可能希望从此对象的构造函数中调用initKeywords
。
答案 2 :(得分:0)
keywords
或t
为空。使用调试器或打印语句,确定起来应该非常简单。如果keywords
为空,我会假设尚未调用initKeywords()
。
答案 3 :(得分:0)
我个人试图远离init方法。如前所述,构造函数用作初始化程序,静态块也是如此:
private final static Set<String> KEYWORDS = new HashSet<String>();
static {
keywords.add("final");
keywords.add("int");
keywords.add("while");
keywords.add("if");
keywords.add("else");
keywords.add("print");
}