Ponteiro nulo Exceção: erro nula [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
Eu tenho esse código Hash Set e quando tento executar o meu método de compilação nele recebo a exceção de ponteiro nulo: erro nulo sobre ele. Aqui está o código:
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;
}
}
As outras linhas que vai junto com este erro é:
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);
}
Solução
De qualquer keywords
ou t
é nulo. Usando um depurador ou instruções de impressão que deve ser simples bastante para determinar. Se keywords
é nulo, eu supor que initKeywords()
não foi chamado ainda.
Outras dicas
Você tem certeza de que você está executando initKeywords()
antes isIdent()
?
Você provavelmente quer chamar initKeywords
a partir do construtor deste objeto.
Eu, pessoalmente, tentar ficar longe de métodos de inicialização. Como mencionado anteriormente, um construtor serve como um inicializador, e o mesmo acontece com o bloco estático:
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");
}