2013-01-31 15 views
8

Könnte jemand erklären, was mit diesem Code falsch ist:Illegal Vorwärts-Referenz java Ausgabe

public class Base { 


    static { 
     i = 1; 
     System.out.println("[Base]after static init block i=" + i);// LINE 1 
     System.out.println("*************************************"); 
     System.out.println(); 
    } 
    static int i; 



    public static void main(String[] args) { 
     System.out.println(Base.i); 
    } 
} 

Wenn ich LINE Kommentar 1 - alles ist in Ordnung und Base.main Methode druckt „1“. Wenn LINE 1 - nicht kommentiert ist, hat die Kompilierzeit Fehler: "illegale Forward-Referenz". Also, wie ich im statischen init Block verstehe, kann ich Wert für i setzen, aber nicht lesen. Könnte jemand erklären warum?

Antwort

14

Dies ist wegen der restrictions on the use of Fields during Initialization. Insbesondere kann die Verwendung von statischen Feldern innerhalb eines statischen Initialisierungsblocks vor der Zeile, auf der sie deklariert sind, nur auf der linken Seite eines Ausdrucks (d. H. Einer Zuweisung) liegen, sofern sie nicht vollständig qualifiziert sind (in Ihrem Fall Base.i).

Also zum Beispiel: wenn Sie int j = i; direkt nach i = 1; einfügen, würden Sie den gleichen Fehler erhalten.

Der offensichtliche Weg, das Problem zu lösen, ist static int i;vor der statische Initialisierungsblock zu deklarieren.

2

"Illegale Forward-Referenz" bedeutet, dass Sie versuchen, eine Variable zu verwenden, bevor sie definiert wird.

Das von Ihnen beobachtete Verhalten ist ein Symptom eines Javac-Bugs (siehe diesen Fehlerbericht). Das Problem scheint in neueren Versionen des Compilers behoben zu sein, z. 7. OpenJDK

haben einen Blick auf

Illegal forward reference error for static final fields

+1

Ich glaube nicht, dass das Verhalten, wie in der Frage beschrieben, ein Fehler ist. – assylias

2

Ihren Code ändern:

int i; 
static { 
    i = 1; 
    System.out.println("[Base]after static init block i=" + i);// LINE 1 
    System.out.println("*************************************"); 
    System.out.println(); 
} 
3

Sie Base Ihre i-Variable in statischen Block hinzufügen kann oder Sie haben static int i vor dem Block zu erklären. Eine andere Lösung besteht darin, eine statische Methode anstelle einer statischen Blockierung zu erstellen.

static { 
    Base.i = 1; 
    System.out.println("[Base]after static init block i=" + Base.i);// LINE 1 
    System.out.println("*************************************"); 
    System.out.println(); 
} 
+0

+1 guter Punkt .. – assylias

+0

es ist genug, um nur Base in System.out-Anweisung, danke hinzuzufügen. – Timofei