java.util.MissingResourceException: Couldn't find 3-letter country code for CS

ultimate.divinity picture ultimate.divinity · Nov 28, 2012 · Viewed 7.8k times · Source

I get the exception:

Exception in thread "AWT-EventQueue-0" java.util.MissingResourceException: Couldn't find 3-letter country code for CS
    at java.util.Locale.getISO3Country(Locale.java:1521)
    at Business.CountryList.CountryList(CountryList.java:29)

I call the function like this:

countryJComboBox.removeAllItems();
countryJComboBox.addItem(CountryList.CountryList(new String[0]));

The class CountryList is as follows:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Business;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

/**
 *
 * @author Vivek
 */
public class CountryList {
    public static Country CountryList(String[] args) {
        List<Country> countries = new ArrayList<>();

        Locale[] locales = Locale.getAvailableLocales();
        for (Locale locale : locales) {
            String iso = locale.getISO3Country();
            String code = locale.getCountry();
            String name = locale.getDisplayCountry();

            if (!"".equals(iso) && !"".equals(code) && !"".equals(name)) {
                countries.add(new Country(iso, code, name));
            }
        }
        Collections.sort(countries, new CountryComparator());
        Country returnCountry = null;
        for (Country country : countries) {
            returnCountry = country;
        }
        return returnCountry;
    }
}

class CountryComparator implements Comparator<Country> {
    private Comparator comparator;
    CountryComparator() {
        comparator = Collator.getInstance();
    }

    @Override
    public int compare(Country o1, Country o2) {
        return comparator.compare(o1.name, o2.name);
    }
}

class Country {
    private String iso;
    private String code;
    public String name;
    Country(String iso, String code, String name) {
        this.iso = iso;
        this.code = code;
        this.name = name;
    }

    @Override
    public String toString() {
        return iso + " - " + code + " - " + name.toUpperCase();
    }
}

Please help me fix the exception.

Answer

Jacob Schoen picture Jacob Schoen · Nov 28, 2012

Basically the locale it is on doesn't seem to have a a 3 letter country code. Since you are trying to ignore countries that do not have a 3 letter iso code anyway:

for (Locale locale : locales) {
   try {
     String iso = locale.getISO3Country();
     String code = locale.getCountry();
     String name = locale.getDisplayCountry();
     if (!"".equals(iso) && !"".equals(code) && !"".equals(name)) {
        countries.add(new Country(iso, code, name));
     }
   catch (MissingResourceException e){
     //do nothing
   }
}

See Java Docs for more.