Locale.getDefault () devuelve la configuración regional no compatible / no válida para Currency.getInstance

mi aplicación usa el siguiente código para obtener la moneda local:

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

Esto funciona bien en todas mis pruebas y nunca antes fue un problema. Hoy vi un CrashLog en Google Play Developer Console: la aplicación se bloquea con:

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

Puedo reproducir fácilmente este error cuando usonew Locale("es") en lugar deLocale.getDefault():

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

En realidad, se produce la misma excepción sin importar el código de idioma que uso, p. "en", "de", "fr", etc. Solo cuando también se especifica el código de país todo funciona bien, p.new Locale("es", "ES")

Tengo dos problemas con la excepción:

1. ¿Por qué "es" no es un entorno local válido? Tan rápido como entiendo, los nombres locales están formados por un código de idioma (en minúsculas) y unOpcional código de país. Asíes-ESsería un entorno local válido, pero "es" también debería serlo, ¿no?

2. ¿Qué puedo hacer para evitar este problema? yo sueloLocale.getDefault() en toda la aplicación para proporcionarle al usuario la moneda local, el formato del número local, etc. Supongo que el sistema siempre devuelve una configuración regional válida, pero obviamente este no es el caso. ¿Cómo puedo asegurarme de que se utiliza una configuración regional válida?

Respuestas a la pregunta(2)

Su respuesta a la pregunta