.charAt() возвращает nullpointerexception

Я написал небольшую программу, в которой у меня есть двумерный массив с именами String. Во вложенном цикле я проверяю первый символ в каждом элементе массива. Если первый символ "A" || 'E' || "Я" || 'O' || "U", я записываю этот элемент в файл с FileWriter. Однако каждый раз, когда я пытаюсь скомпилировать программу, я получаю исключение NullPointerException. Это код:

FileWriter fw = new FileWriter ("imena.txt");

String polje[][] = new String[5][5];
polje[0][0] = "Janez";
polje[0][1] = "Tine";
polje[0][2] = "Miha";
polje[0][3] = "Klemen";
polje[0][4] = "Jure";

polje[1][0] = "Tone";
polje[1][1] = "Andrej";
polje[1][2] = "Janko";
polje[1][3] = "Nejc";
polje[1][4] = "Erik";

for(int i = 0; i < polje.length; i++) {
    for(int j = 0; j < polje[0].length; j++) {
        if(polje[i][j].charAt(0) == 'A') {
            fw.write(polje[i][j] + '\n');
        }
    }
}

Если я изменю, если на if(polje[1][1].charAt(0) == 'A') он работает отлично, но я хочу перебрать все элементы в массиве. Любая помощь будет наиболее ценной.

Как оказалось, я забыл инициализировать все элементы в моем массиве. Я не могу поверить, что я не мог увидеть проблему сам.:)

Спасибо всем за помощь!;)

3 ответа

Вы только инициализировали, насколько polje[1][...], Так когда i это 2 (и j есть что-нибудь), polje[i][j] будет нулевым... и когда вы разыменовываете его, позвонив charAt(0)Вы получите исключение.

Обратите внимание, что такого рода ошибки можно избежать, используя List вместо массивов, где размер растет динамически. Вы могли бы даже смешать два:

List<String[]> polje = new ArrayList<>();
polje.add(new String[] { "Janez", "Tine", ... };
polje.add(new String[] { "Tone", "Andrej", ... };

for (String[] array : polje) {
    for (String item : array) {
        // This way you'll handle empty strings, too
        if (item.startsWith("A")) {
            fw.write(item + '\n');
        }
    }
}

Использование new String[2][5]; в вашем примере. С [5][5]Вы инициализируете матрицу 5*5 с нулевыми значениями.

Другое решение может состоять в том, чтобы просто добавить ненулевое условие:

polje[i][j] != null && polje[i][j].charAt(0) == 'A'

Вы только инициируете поля [0] и поля [1], NPE происходит, когда вы нажимаете поле [3][0]

Другие вопросы по тегам