2013-03-04 15 views
6

Ho già segnalato questo problema in CLJ-1172, ma non ho ricevuto alcun feedback dal team Clojure. Forse qualcuno qui può dirmi cosa c'è che non va. Questo è il mio codice:NPE in clojure.lang.Compiler quando si tenta di caricare una risorsa

import clojure.lang.Compiler; 
Compiler.load(new StringReader("(+ 5 6)")); 

Eccezione in fase di esecuzione:

java.lang.ExceptionInInitializerError 
    at clojure.lang.Compiler.<clinit>(Compiler.java:47) 
Caused by: java.lang.NullPointerException 
    at clojure.lang.RT.baseLoader(RT.java:2043) 
    at clojure.lang.RT.load(RT.java:417) 
    at clojure.lang.RT.load(RT.java:411) 
    at clojure.lang.RT.doInit(RT.java:447) 
    at clojure.lang.RT.<clinit>(RT.java:329) 

assomiglia RT e Compiler classi si riferiscono staticamente gli uni agli altri. Sto usando la dipendenza org.clojure:clojure:1.5.0.

risposta

8

È normale che le classi si riferiscano in modo statico a vicenda finché i loro campi vengono inizializzati nell'ordine corretto. In questo caso, Clojure probabilmente prevede di inizializzare RT prima del Compiler. Ecco la sequenza di eventi:

  1. Quando si effettua una chiamata statica a Compiler, Java inizializza tutti i campi statici in quella classe.
  2. L'inizializzatore statico per Compiler.FNONCE (riga 47) chiama un metodo statico in RT, che provoca l'inizializzazione dell'intera classe prima che il valore di FNONCE sia calcolato e impostato.
  3. Il blocco di inizializzazione statico per RT che inizia nella riga 299 chiama un metodo statico che alla fine si riferisce al campo statico Compiler.LOADER.
  4. La JVM normalmente inizializza la classe Compiler qui, ma vede che Compiler è attualmente in fase di inizializzazione e prende solo il valore corrente. I campi vengono inizializzati nell'ordine in cui sono dichiarati nel file e poiché LOADER arriva dopo lo FNONCE viene restituito il valore non inizializzato di null, generando un NPE quando viene annullato in riferimento a RT.

Linea di fondo: effettuare una chiamata a un metodo statico nella RT (o leggere un campo statico) prima della chiamata al Compiler.load e il vostro errore dovrebbe andare via.

Ulteriori dettagli sulle specifiche di inizializzazione della classe sono disponibili nella sezione 12.4 dello Java Language Specification.

+0

hai ragione, chiamare 'RT.init()' in anticipo risolve il problema, grazie! – yegor256

Problemi correlati