【发布时间】: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