.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]