我正在为课堂建立一个词汇/ syntex分析器。我遇到的问题是当我尝试从除了main之外的方法访问我的静态变量“lexems”或“tokens”时它们是NULL。当我在main中使用它们时(例如lex.printList方法),它们很好并且填充了数据。
怎么回事?
A = [T,B,C,D,E,F,G,H,I,J,K,L,M,N,O];
fileID = fopen('baseline1.txt','w');
fprintf(fileID,['%6s ' repmat('%12s ',[1 14]) '\n'],'T','B','C','D','E','F','G','H','I','J','K','L','M','N','O');
fprintf(fileID,['%6s ' repmat('%12s ',[1 14]) '\n'],A.');
fclose(fileID);
答案 0 :(得分:8)
您正在使用本地对象覆盖 lexems 对象,因此它不是您在main函数内修改的 static 变量。
要操作你应该做的静态
/*NOTHING HERE!!*/ lexems = lex.getLexems();
lex.printList(lexems);
...
令牌出现同样的问题
/*NOTHING HERE!!*/ tokens = lex.getTokens();
lex.printList(tokens);
...
答案 1 :(得分:1)
问题在于:
ArrayList<String> lexems = lex.getLexems();
lex.printList(lexems);
ArrayList<String> tokens = lex.getTokens();
在main函数中,您不修改静态变量,而是修改静态变量(main函数中的local)。 只需将其更改为:
lexems = lex.getLexems();
tokens = lex.getTokens();
答案 2 :(得分:0)
您正在main方法中创建另一对变量,这些变量恰好与静态变量具有相同的名称,并且在main方法的范围内“掩盖”它们。
要解决此问题,您不应声明新变量,而应初始化现有变量:
public static void main(String[] args) throws IOException {
LexicalAnalysis lex = new LexicalAnalysis();
lex.getFile();
lex.parseText();
lexems = lex.getLexems();
lex.printList(lexems);
tokens = lex.getTokens();
lex.printList(tokens);
//expr();
lex();
}
答案 3 :(得分:0)
这应该有助于区分代码中使用的范围:
public class MyClass{
private static int myInt;
public static void main(String[] args){
int myInt = 6;
printMyInt();
}
static void printMyInt(){ System.out.println(myInt); } // Prints 0 because uses the class field
}