【问题标题】:Locale.getDefault() returns unsuported / invalid Locale for Currency.getInstanceLocale.getDefault() 为 Currency.getInstance 返回不受支持/无效的语言环境
【发布时间】:2014-10-15 07:06:21
【问题描述】:

我的应用使用以下代码获取当地货币:

Locale locale = Locale.getDefault()
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);

这在我的所有测试中都运行良好,并且以前从未出现过问题。今天我在 Google Play 开发者控制台中看到了一个 CrashLog:应用程序崩溃了:

java.lang.IllegalArgumentException: Unsupported ISO 3166 country: es

当使用new Locale("es") 而不是Locale.getDefault() 时,我可以轻松重现此错误:

Locale locale = new Locale("es");
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);

实际上,无论我使用什么语言代码,都会引发相同的异常,例如“en”、“de”、“fr”等。仅当还指定了国家代码时,一切正常,例如new Locale("es", "ES")

我有两个异常问题:

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

2。我能做些什么来避免这个问题?我在整个应用程序中使用Locale.getDefault() 为用户提供语言环境货币、语言环境数字格式等。我假设系统总是返回一个有效的语言环境,但这显然不是案子。如何确保使用了有效的语言环境?

【问题讨论】:

  • 您认为货币与国家或语言有关吗?
  • 当然,这应该与国家/地区相关联,但对于其他“区域设置”设置(例如数字或日期格式)也是如此。虽然使用 `SimpleDateFormat("...", new Locale("es")) 似乎没有问题(我应该使用 ES 还是美国日期格式?).getCurrency 同样失败。所以问题是:还有其他可能失败的事情吗?

标签: java android exception locale


【解决方案1】:

我也遇到过这个问题,我觉得目前的答案不完整。当您在 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,并返回相关的默认值。

为了安全起见,我已将其扩展到所有使用 Locale 的地方。

希望对看到这里的其他人有所帮助。

【讨论】:

  • 你的意思是这个异常只发生在 Firebase 测试实验室,不能在真机上发生吗?
【解决方案2】:

你应该注意这一点:

http://docs.oracle.com/javase/7/docs/api/java/util/Currency.html#getInstance(java.util.Locale)

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

【讨论】:

  • 当然,不知道国家就很难找到一种货币。但这也适用于其他“区域设置”设置,例如数字或日期格式。虽然使用 `SimpleDateFormat("...", new Locale("es")) 似乎没有问题(我应该使用 ES 还是美国日期格式?).getCurrency 同样失败。所以问题是:还有其他可能失败的事情吗?
猜你喜欢
  • 2013-01-10
  • 2020-04-05
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多