Les Initialiseurs Statiques Et Méthodes Statiques En Java

Ne l'appel d'une méthode statique d'une classe en Java déclencheur statique initalization blocs pour obtenir exécuté?

Empiriquement, je dirais que non. J'ai quelque chose comme ceci:

public class Country {
    static {
        init();
        List<Country> countries = DataSource.read(...); //get from a DAO
        addCountries(countries);
    }

    private static Map<String, Country> allCountries = null;

    private static void init() {
        allCountries = new HashMap<String, Country>();
    }

    private static void addCountries(List<Country> countries) {
        for (Country country : countries) {
            if ((country.getISO() != null) && (country.getISO().length() > 0)) {
                allCountries.put(country.getISO(), country);
            }
        }
    }

    public static Country findByISO(String cc) {
        return allCountries.get(cc);
    }
}

Dans le code à l'aide de la classe, je fais quelque chose comme:

Country country = Country.findByISO("RO");

Le problème est que je reçois un NullPointerException parce que la carte (allCountries) n'est pas initialisé. Si j'ai mis en place de points d'arrêt dans le static bloquer je peux voir la carte se rempli correctement, mais c'est comme si la méthode statique n'a pas connaissance de l'initialiseur, en cours d'exécution.

Quelqu'un peut expliquer ce comportement?


Mise à jour: j'ai ajouté plus de détails pour le code. C'est quand même pas 1:1 (il y a plusieurs cartes dans il et plus logique), mais j'ai explicitement regardé les déclarations et les références de allCountries et ils sont énumérés ci-dessus.

Vous pouvez voir l'intégralité du code d'initialisation ici.

Mise à jour #2: j'ai essayé de simplifier le code, autant que possible, et écrit à la volée. Le code a la statique de la déclaration de la variable après l'initialiseur. Qui a provoqué la remise à zéro de la référence, comme Jon l'a souligné dans la réponse ci-dessous.

J'ai modifié le code dans mon post pour refléter cela, donc c'est plus clair pour les personnes qui trouvent la question. Désolé pour la confusion tout le monde. J'essayais juste de faire de la vie de chacun plus facile :).

Merci pour vos réponses!

pouvez-vous montrer le code avec lequel vous initialisez la carte ?
Btw il manque le type de retour de la findByISO() la méthode dans votre exemple.

OriginalL'auteur Alex Ciminian | 2012-03-13