2012-06-18 8 views
7

Widzę dziwne zachowanie, które wydaje się nie powinno się zdarzyć zgodnie z JMM. Mam klasy B, która rozszerza klasy A, ostateczne pole chronione w A, który jest zainicjowany w konstruktorze dostęp B klasy w jego konstruktora.Ostateczny stan pól, gdy uzyskano dostęp z podklasy

Ale w bardzo rzadkich przypadkach, kiedy mogę uzyskać w B. jakieś pomysły na NPE?

część kodu:

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

mógłbyś pisać minimalny uszkodzoną przykład? W przeciwnym razie zgadujemy. –

+0

jaki jest kod? – plucury

+1

Czy możesz podać przykład odtwarzający wyjątek? – sp00m

Odpowiedz

1

Nie da się powiedzieć na pewno z kodu pisał sam, ale jeśli jesteś pewien, że sam rejestrator jest null, (i nie są mylnie widząc NPE od wewnątrz powiedz, specificLogger.finest), wtedy najbardziej prawdopodobne jest to, że Logger.getLogger czasami z jakiegoś powodu zwraca wartość zerową.

Nie sądzę, że problem jest wątkowanie, ponieważ ostateczne pola przypisane do konstruktora są widoczne, gdy obiekt jest widoczny, o ile wewnątrz konstruktora nie wyciekają referencje.

0

To naprawdę nie jest łatwo powiedzieć ze swojego przykładu, ale moi guese byłoby, że ma do czynienia z ramami rejestrowania i wezwanie pociągu wrak zainicjowanie go w konstruktorze. Jest to jedna z deklaracji powodem rejestratora powinny być zawsze private static final

Powiązane problemy