Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Locale.getDefault()返回Currency.getInstance的未移植/无效区域设置_Java_Android_Exception_Locale - Fatal编程技术网

Java Locale.getDefault()返回Currency.getInstance的未移植/无效区域设置

Java Locale.getDefault()返回Currency.getInstance的未移植/无效区域设置,java,android,exception,locale,Java,Android,Exception,Locale,我的应用程序使用以下代码获取本地货币: Locale locale = Locale.getDefault() java.util.Currency localCurrency = java.util.Currency.getInstance(locale); 这在我所有的测试中都很好,以前从来都不是问题。今天,我在Google Play开发者控制台中看到了一个崩溃日志:应用程序崩溃的原因是: java.lang.IllegalArgumentException: Unsupported IS

我的应用程序使用以下代码获取本地货币:

Locale locale = Locale.getDefault()
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);
这在我所有的测试中都很好,以前从来都不是问题。今天,我在Google Play开发者控制台中看到了一个崩溃日志:应用程序崩溃的原因是:

java.lang.IllegalArgumentException: Unsupported ISO 3166 country: es
使用
newlocale(“es”)
而不是
Locale.getDefault()
时,我可以很容易地重现此错误:

实际上,无论我使用的语言代码是什么,都会引发相同的异常,例如“en”、“de”、“fr”等。只有在指定了国家代码的情况下,一切正常,例如
new Locale(“es”、“es”)

除此之外,我还有两个问题:

1。为什么“es”不是有效的区域设置?据我所知,区域设置名称由语言代码(小写)和可选的国家代码组成。因此,
es-es
将是一个有效的区域设置,但“es”也应该是,不是吗


2。如何避免此问题?我在整个应用程序中使用
Locale.getDefault()
为用户提供语言环境货币、语言环境编号格式等。我假设系统总是返回有效的语言环境,但情况显然不是这样。如何确保使用了有效的区域设置?

您应该注意以下几点:


如果您指定一种语言而没有国家,系统将无法确定货币。

我也遇到过这个问题,我觉得当前的答案不完整。当您在Firebase虚拟机上运行时,会弹出此问题(您也可以通过选择相应的语言环境,如en、de、es等,在仿真器上执行此操作)

我通过创建一个自定义类解决了这个问题,该类使用try检索失败的货币记帐:

public static Locale getLocalCurrency() {
    try {
        return Currency.getInstance(Locale.getDefault());
    } catch (NullPointerException | IllegalArgumentException ex) {
        return Currency.getInstance(new Locale("en", "US"));
    }
}
这基本上是假设如果失败,它将返回美国的语言环境。这可以很容易地扩展以检测语言,即es,并返回相关的默认值

为了安全起见,我已经将这一点扩展到了使用区域设置的所有地方


希望这能帮助其他关注此问题的人。

您认为货币是链接到国家或语言的吗?当然,这应该链接到国家,但其他“区域设置”设置(如数字或日期格式)也是如此。虽然使用` SimpleDataFormat(“…”,new Locale(“es”)(我应该使用es还是使用US日期格式?)似乎没有问题,但对于.getCurrency来说,同样的事情也失败了。所以问题是:还有其他东西也可能失败吗?当然,不了解这个国家就很难找到一种货币。但对于其他“区域设置”设置,如数字或日期格式,也是如此。虽然使用` SimpleDataFormat(“…”,new Locale(“es”)(我应该使用es还是使用US日期格式?)似乎没有问题,但对于.getCurrency来说,同样的事情也失败了。所以问题是:还有其他可能失败的事情吗?你的意思是,这种例外只发生在Firebase测试实验室,而不能发生在真正的设备上吗?
public static Locale getLocalCurrency() {
    try {
        return Currency.getInstance(Locale.getDefault());
    } catch (NullPointerException | IllegalArgumentException ex) {
        return Currency.getInstance(new Locale("en", "US"));
    }
}