2015-10-14 3 views
0

Im создает лексический/синтаксический анализатор для класса. Проблема, с которой я сталкиваюсь, - это когда я пытаюсь получить доступ к моей статической переменной «lexems» или «tokens» из метода, кроме основного, они являются NULL. Когда я использую их в основном (например, метод 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

Вы перекрывая лексем объекта с локальным, так что не статического переменными вы изменяете внутри основной функции.

Для работы на статический вы должны сделать

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

Та же проблема с лексем происходит

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

Вы могли бы также хочу указать, что статические поля * не * 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

Вы создаете другую пару переменных в основной метод, который, случается, имеют те же имена, как ваши статические переменные, и «затмить» их в рамках основного метода.

Чтобы исправить это, вы не должны объявлять новые переменные, но инициализирует существующие:

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 
} 
Смежные вопросы