2012-06-18 6 views
7

Veo un comportamiento extraño que parece que no debería suceder según JMM. Tengo la clase B que extiende la clase A, un campo protegido final en A que se inicializa en un constructor al que accede la clase B en su constructor.Los campos finales indican cuando se accede desde la subclase

embargo, en casos muy raros me siento un NPE cuando se accede en B. ¿Alguna idea?

parte del código:

class AsyncReplicationSourceGroup extends AbstractReplicationSourceGroup{ 

    public AsyncReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfig){ 
     super(groupConfig); 
     createReplicationChannels(); 
    } 

    protected void createReplicationChannels(){ 
     //... 
     specificLogger.finest("created channel"); // this is where the NPE is thrown from 
     //... 
    } 
} 

abstract class AbstractReplicationSourceGroup{ 

    protected final Logger specificLogger; 

    public AbstractReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfigHolder){ 
     specificLogger = Logger.getLogger(Constants.LOGGER_REPLICATION_GROUP + "." + _groupConfigHolder.getConfig().getName()); 
     //... 
    } 

} 
+10

Podría publicar un ejemplo no haber mínimo? De lo contrario, estamos adivinando. –

+0

¿cómo le gusta el código? – plucury

+1

¿Podría proporcionar un ejemplo que reproduzca la excepción? – sp00m

Respuesta

1

Es imposible saber con certeza a partir del código publicado solo, pero si está seguro de que el registrador sí es nula, (y usted no está viendo por error un NPE desde adentro digamos, specificLogger.finest), entonces la explicación más probable es que Logger.getLogger ocasionalmente devuelve null por algún motivo.

No creo que el problema está enhebrando porque los campos finales asignadas a en un constructor se garantiza que sea visible una vez que el objeto construido es visible, siempre y cuando no hay referencias de fugas dentro del constructor.

0

En realidad no es fácil decir de su ejemplo, pero mis neerlandesa habría que tiene que lidiar con el marco de registro y el llamado choque de trenes para inicializar en el constructor. Esta es una de las declaraciones razón registrador debe estar siempre privado static final

Cuestiones relacionadas