NullPointerException в массиве Создание из файла

* Следующий код создает array "2D" из строк в текстовом файле. В настоящее время он возвращает ошибку NullPointException в строке:

temp = thisLine.split (разделитель); Мой вопрос: правильно ли я понимаю, что <code>temp</code> возвращает <code>null</code>? Если да, то почему и как добавить чек для <code>null</code>? Я новичок в Java, и это моя первая попытка создания <code>array</code> строк из <code>arrays</code>. *

--------Редактировать--------

Вышеизложенное было решено.

Для тех, кто заинтересован ниже, это код, возвращающий значение IndexOutOfBoundsException. В частности, строка:

fileContents.set(i, fileContents.get(i).replace(hexLibrary [i] [0], hexLibrary [i] [1]));

System.out.println("SnR after this");

 String[][] hexLibrary; // calls the replaces array from the LibToArray method
 hexLibrary = LibToArray();

 for(int i=0;i<502;i++){
 {
 fileContents.set(i, fileContents.get(i).replace(hexLibrary[i][0], hexLibrary[i][1]));
 } 
 }
 for (String row : fileContents) {
 System.out.println(row); // print array to cmd
 }

______________________________

public static String[][] LibToArray()
 {

 String thisLine; 
 String[] temp; 
 String delimiter=","; 
 String [][] hexLibrary = new String[502][2]; 
 try
 {
 BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt")); 
 for (int j=0; j<502; j++) { 
 thisLine=br.readLine(); 
 temp = thisLine.split(delimiter); 
 for (int i = 0; i < 2; i++) { 
 hexLibrary[j][i]=temp[i]; 
 } 
 } 
 }
 catch (IOException ex) { // E.H. for try
 JOptionPane.showMessageDialog(null, "File not found. Check name and directory."); // error message
 }
 return hexLibrary;
 }
3 ответа

Скорее всего, thisLine имеет значение null. Это произойдет, если у вас закончится ввод до того, как будут прочитаны 502 строки. Если thisLine не является null, то thisLine.split(delimiter) не возвращает null. Вы всегда должны проверить null строку:

for (int j=0; j<502; j++) { 
 thisLine=br.readLine(); 
 if (thisLine != null) {
 temp = thisLine.split(delimiter); 
 for (int i = 0; i < 2; i++) { 
 hexLibrary[j][i]=temp[i]; 
 } 
 } else {
 // report error: premature end of input file
 break; // no point in ********** to loop
 }
}

Лично я бы написал ваш метод, чтобы не предполагать какую-либо конкретную длину файла:

public static String[][] LibToArray() {
 List<string[]> lines = new ArrayList<>();
 String delimiter=","; 
 try (BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt"))) {
 String line = br.readLine();
 while (line != null) {
 String[] tmp = line.split(delimiter);
 // the next line is dangerous--what if there was only one token?
 // should add a check that there were at least 2 elements.
 lines.add(new String[] {tmp[0], tmp[1]});
 line = br.readLine();
 }
 } catch (IOException ex) {
 JOptionPane.showMessageDialog(null, "File not found. Check name and directory.");
 }
 String[][] hexLibrary = new String[lines.length][];
 lines.toArray(hexLibrary);
 return hexLibrary;
}
</string[]>

(В приведенном выше примере используется новый синтаксис Java 7 try-with-resources. Если вы используете более раннюю Java, вы должны добавить предложение finally, которое закрывает br до возвращения метода.


Если первая строка (или любая строка) файла hexlibrary.txt пуста или не ограничена символами "," s, массив String, возвращаемый split(), вероятно, будет null. Чтобы проверить это, просто добавьте if-условие вокруг вашего второго цикла, что-то вроде этого: if (temp == null) {/* your loop here */}


Вы не проверяете конец потока во время чтения файла.

Метод readLine возвращает null если читатель достигает конца потока. Вы ударяете эту точку (null) в первом for цикла (перед выходом), в зависимости от количества строк в текстовом файле.

licensed under cc by-sa 3.0 with attribution.