Ошибка при интернационализации прикладной программы Java

182
23 сентября 2018, 00:30

Изучаю пример с применением интернационализации с помощью классов ResourceBundle и ListResourceBundle.

Пример демонстрирует применение комплектов ресурсов под именем семейства SampleRB.

После компиляции я постоянно получаю ошибку:

Английская версия программы: 
Exception in thread "main" java.lang.NullPointerException
    at java.util.ListResourceBundle.loadLookup(ListResourceBundle.java:202)
    at java.util.ListResourceBundle.handleGetObject(ListResourceBundle.java:130)
    at java.util.ResourceBundle.getObject(ResourceBundle.java:441)
    at java.util.ResourceBundle.getString(ResourceBundle.java:407)
    at LRBDemo.LRBDemo.main(LRBDemo.java:12)

Сама программа состоит из класса LRBDemo с запускающим методом main-ом:

public class LRBDemo {
    public static void main(String[] args) {
        // загрузить комплект ресурсов по умолчанию
        ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB");
        System.out.println("Английская версия программы: ");
        System.out.println("Строка по ключу Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
        // загрузить комплект ресурсов для поддержки немецкого языка
        rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN);
        System.out.println("\nНемецкая версия программы: ");
        System.out.println("Строка для ключа Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
    }
}

Класса SampleRB с поддержкой английского языка:

public class SampleRB extends ListResourceBundle {
    protected Object[][] getContents() {
        Object[][]  resources = new Object[3][2];
        resources[0][0] = "title";
        resources[0][1] = "MyProgram";
        resources[1][0] = "StopText";
        resources[1][1] = "Stop";
        resources[1][0] = "StartText";
        resources[2][1] = "Start";
        return resources;
    }
}

И класса SampleRBde с поддержкой немецкого языка:

public class SampleRBde extends ListResourceBundle {
    protected Object[][] getContents() {
        Object[][] resources = new Object[3][2];
        resources[0][0] = "title";
        resources[0][1] = "Mein Programm";
        resources[1][0] = "StopText";
        resources[1][1] = "Anschlag";
        resources[2][0] = "StartText";
        resources[2][1] = "Anfang";
        return resources;
    }
}

Сам код не отображает ошибок, но если я пропишу в классе LRBDemo вместо строки ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB") таким образом ResourceBundle rd = ResourceBundle.getBundle("SampleRB") и вместо rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN); так rd = ResourceBundle.getBundle("SampleRBde", Locale.GERMAN);, то есть убираю пакет классов, то получаю на выводе:

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name SampleRB, locale ru_RU
    at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:773)
    at LRBDemo.LRBDemo.main(LRBDemo.java:9)

Структура моего проекта:

Буду благодарен за совет, как убрать ошибки и вывести наконец результат.

Answer 1

1) Исправил индексы:

вместо

resources[1][0] = "StartText";
resources[2][1] = "Start";

так

resources[2][0] = "StartText";
resources[2][1] = "Start";

2)

public class LRBDemo {
    public static void main(String[] args) {
        // загрузить комплект ресурсов по умолчанию
        ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB");
        System.out.println("Английская версия программы: ");
        System.out.println("Строка по ключу Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
        // загрузить комплект ресурсов для поддержки немецкого языка
        rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN);
        System.out.println("\nНемецкая версия программы: ");
        System.out.println("Строка для ключа Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
    }
}

или

public class LRBDemo {
    public static void main(String[] args) {
        // загрузить комплект ресурсов по умолчанию
        ResourceBundle rd = ResourceBundle.getBundle(SampleRB.class.getName());
        System.out.println("Английская версия программы: ");
        System.out.println("Строка по ключу Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
        // загрузить комплект ресурсов для поддержки немецкого языка
        rd = ResourceBundle.getBundle(SampleRBde.class.getName());
        System.out.println("\nНемецкая версия программы: ");
        System.out.println("Строка для ключа Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
    }
}
READ ALSO
Выполнять действие пока нажата кнопка

Выполнять действие пока нажата кнопка

Нужна кнопка нажав, на которую можно выполнить действие и если кнопка зажата дальше чем, скажем, 200 мс, то выполнять действие до тех пор, пока...

192
JAva netty отправка сообщений клиенту

JAva netty отправка сообщений клиенту

Не получаю ответа от сервера исключений ни какихНе знаю уже что делать, помогите люди добрые! 1 хендлер

201
Как правильно написать Try and Catch

Как правильно написать Try and Catch

второй файл кода если хотите понять:

198
Как удалить/заменить символы в строке в JAVA используя Apache POI

Как удалить/заменить символы в строке в JAVA используя Apache POI

У меня есть exel файл в котором 2 колонки: номер телефона и именаНапример 380677777055 - ОЛЕГ И в номере телефона бывают ошибки когда вместо "0" стоит...

215