Statische Initialisierungen Und Statische Methoden In Java

Tut, Aufruf einer statischen Methode einer Klasse in Java auslösen der statischen Initialisierung der Blöcke ausgeführt werden?

Empirisch, würde ich Nein sagen. Ich habe so etwas wie dieses:

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);
    }
}

In den code mit der Klasse, ich glaube so etwas wie:

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

Das problem ist, dass ich eine NullPointerException da die Karte (allCountries) ist nicht initialisiert. Wenn ich die Haltepunkte in der static block I können Sie die Karte immer ordnungsgemäß gefüllt, aber es ist, als ob die statische Methode hat keine Kenntnis von der Initialisierung ausgeführt wird.

Kann jemand erklären Sie dieses Verhalten?


Update: ich habe nun mehr Details zu der code. Es ist noch nicht 1:1 (da gibt es mehrere Karten gibt, und mehr Logik), aber ich habe explizit schaute auf die Erklärungen/Referenzen allCountries und Sie sind, wie oben aufgeführt.

Sehen Sie den vollständigen code für die Initialisierung hier.

Update #2: ich habe versucht, den code vereinfachen, so viel wie möglich und schrieb es sich auf das Fliegen. Der eigentliche code hatte der statischen Deklaration von Variablen nach der Initialisierung. Verursacht ein reset der Referenz, wie Jon wies darauf hin, in der Antwort unten.

Modifizierte ich den code in meinen Beitrag zu reflektieren, so ist es klarer für Leute, die finden die Frage. Tut mir Leid wegen der Verwirrung alle. Ich habe nur versucht, jeder machen das Leben leichter :).

Dank für Eure Antworten!

  • können Sie zeigen den code, mit dem Sie initialisieren der Karte ?
  • Btw fehlt der Rückgabetyp der findByISO () - Methode in deinem Beispiel.
Schreibe einen Kommentar