在Java中調用靜態方法是否觸發靜態初始化塊以執行?經驗上,我會說不。我有這樣的事情:使用類Java中的靜態初始化程序和靜態方法
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);
}
}
在代碼中,我這樣做:
Country country = Country.findByISO("RO");
的問題是,我得到了NullPointerException
因爲地圖(allCountries
)未初始化。如果我在static
塊中設置了斷點,我可以看到地圖正確填充,但它好像靜態方法不知道正在執行的初始化程序。
任何人都可以解釋這種行爲嗎?
更新:我已經添加了更詳細的代碼。它仍然不是1:1(這裏有幾張地圖和更多的邏輯),但我已經明確地查看了allCountries
的聲明/參考,它們如上所列。
您可以看到完整的初始化代碼here。
更新#2:我試圖儘可能簡化代碼,並在飛行中寫下它。實際的代碼在初始化程序後有靜態變量聲明。正如喬恩在下面的答案中指出的那樣,這導致它重置參考。
我修改了我的帖子中的代碼以反映這一點,所以對於發現問題的人來說更清楚。對不起每個人都很困惑。我只是想讓每個人的生活更輕鬆:)。
感謝您的回答!
你可以顯示你初始化地圖的代碼嗎? – Tom 2012-03-13 22:12:54
順便說一句,你在示例中缺少findByISO()方法的返回類型。 – 2012-03-13 22:18:10