2015-10-14 57 views
0

我正在爲類構建一個詞法/ syntex分析器。我遇到的問題是當我嘗試從主方法訪問我的靜態變量「lexems」或「令牌」時,他​​們是NULL。當我在main(比如lex.printList方法)中使用它們時,它們很好並且填充了數據。靜態變量在主要方法外顯示爲空

怎麼回事???

import java.io.IOException; 
import java.util.ArrayList; 

public class SyntaxAnalyzer { 
    public static int pos = 0; 
    public static ArrayList<String> lexems = new ArrayList<String>(); 
    public static ArrayList<String> tokens = new ArrayList<String>(); 
    public static String nextToken; 

    public static void main(String[] args) throws IOException { 
     LexicalAnalysis lex = new LexicalAnalysis(); 
     lex.getFile(); 
     lex.parseText(); 
     ArrayList<String> lexems = lex.getLexems(); 
     lex.printList(lexems); 
     ArrayList<String> tokens = lex.getTokens(); 
     lex.printList(tokens); 
     //expr(); 
     lex(); 

    } 


    static void lex(){ 
     //String lexem = lexems.get(pos); 
     //System.out.println(lexem); 
     nextToken = tokens.get(pos); 
     pos++; 
    } 
} 

回答

8

要覆蓋與當地一個lexems對象,所以它不是你的主要函數內部修改靜態變量。

要在靜態的工作,你應該做的

/*NOTHING HERE!!*/ lexems = lex.getLexems(); 
    lex.printList(lexems); 
    ... 

令牌同樣的問題也發生

/*NOTHING HERE!!*/ tokens = lex.getTokens(); 
    lex.printList(tokens); 
    ... 
+0

你可能還要指出,靜態字段是* not * null,因爲隱藏/重寫而爲空。巨大差距。 – Andreas

+2

術語是_shadowing_。 –

1

的問題在這裏:

ArrayList<String> lexems = lex.getLexems(); 
lex.printList(lexems); 
ArrayList<String> tokens = lex.getTokens(); 

在你主函數,你不會修改靜態變量,但本地的s(在主函數中是本地的)。 只要將它更改爲:

lexems = lex.getLexems(); 
tokens = lex.getTokens(); 
0

您正在創建另一對在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(); 
    } 
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 
}