java.util.Locale的第一项为空

java.util.Locale的第一项为空,java,jvm,locale,Java,Jvm,Locale,我正试图从JVM中获取所有区域设置,以填充国家/地区下拉列表。第一项是空的非空对象。它不是空的,因为我正在使用树映射集合添加国家缩写和(可显示的)名称。看看下面的收藏是什么 {=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Bra

我正试图从JVM中获取所有区域设置,以填充国家/地区下拉列表。第一项是空的非空对象。它不是空的,因为我正在使用树映射集合添加国家缩写和(可显示的)名称。看看下面的收藏是什么

{=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil,....
这是密码。我删除该空对象以确保第一个值不是空的

public Map<String, String> countries(Locale currentLocale) {
    Map<String, String> countries = new TreeMap<String, String>();
    for (Locale locale : Locale.getAvailableLocales()) {
        countries.put(locale.getCountry(),
                locale.getDisplayCountry(currentLocale));
    }
    countries.remove("");
    return countries;
}
公共地图国家(地区currentLocale){
映射国家=新树映射();
for(Locale:Locale.getAvailableLocales()){
countries.put(locale.getCountry(),
getDisplayCountry(currentLocale));
}
国家。删除(“”);
返回国;
}
JVM版本-(build 1.7.0_09-b05)

尝试

    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println(locale.getLanguage() + " " + locale.getCountry());
    }
您将看到一些地区只有语言,没有国家

ms MY
ar QA
is IS
fi FI
pl 
en MT
...
报告基本上涵盖了这一点

对于
locale.getCountry()
,您可以找到:

返回此区域设置的国家/地区代码,该代码应为空字符串、大写ISO 3166 2字母代码或UN M.49 3位代码

对于
locale.getDisplayCountry()
您会发现:

返回适合显示给用户的区域设置国家/地区的名称。如果可能,返回的名称将本地化为默认区域设置。例如,如果区域设置为fr_fr,默认区域设置为en_US,则getDisplayCountry()将返回“France”;如果区域设置为en_US,默认区域设置为fr_fr,则getDisplayCountry()将返回“Etats Unis”。如果返回的名称无法本地化为默认区域设置(例如,我们没有克罗地亚的日语名称),则此函数将使用英语名称,并使用ISO代码作为最后的值。如果区域设置未指定国家,此函数将返回空字符串


你看不见的那个没有ISO代码,现在又回到了ISO代码,因为它无法本地化到你的语言环境,也没有英文名称(或者,没有指定国家)。这两种语言都是空字符串,这是完全正确的(尽管这很没用)。

所讨论的语言环境正是
locale==locale.ROOT
在我这边,我假设你也是这样

为什么
Locale.ROOT
存在?根据:

如果指定的区域设置提供程序都不支持请求的区域设置,则使用locale.ROOT区域设置的默认“JRE”区域设置提供程序的资源。例如,如果在“java.locale.providers”系统属性中只指定了“CLDR”,则Collator的工作方式与请求根区域设置一样,因为“CLDR”区域设置提供程序不提供Collator区域设置数据。指定“CLDR,JRE”补充了“JRE”语言环境提供程序的Collator功能,并将“CLDR”语言环境提供程序的其他语言环境数据优先于“JRE”的数据


正确的。但是为什么locale.getCountry()和locale.getDisplayCountry()都是空的呢?事实上我重新阅读了你的答案,这很有道理。我不认为使用JVM是获取国家列表的正确方法。此外,名称基于选定的区域设置。对我们来说,我们的名字不见了,对其他人来说。。我们会得到更多。对-这是一个
Locale
但是。。。没有你想要的东西。有些只是语言标签。嗨,布莱恩。你的回答很好,但我相信在这种情况下它实际上是不正确的。请看这可能是SO正在寻找的答案。