IndexOutOfBoundsException для пустой строки в конце файла

153
06 января 2022, 15:50

Есть такой код, читающий файл:

// Reading lines from a file.
String fileName = defineFileName(path.toString());
List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Николай\\Documents\\TestSMS\\" + fileName));
String line1 = lines.get(0);
String line2 = lines.get(3);
String TextMessages = lines.get(13);

Если lines.get(0) - пустая строка, а lines.get(13) - не пустая, то IndexOutOfBoundsException не выбрасывает. Но если lines.get(13) - пустая строка в файле, то получаю:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 13, Size: 13
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)
at java.util.ArrayList.add(ArrayList.java:477)
at com.app.sms.reader.impl.SimpleSmsReader.smsReader(SimpleSmsReader.java:103)
at com.app.sms.reader.impl.SimpleSmsReader.readSms(SimpleSmsReader.java:64)
at com.app.workflow.impl.SimpleSmsWorkflow.processSms(SimpleSmsWorkflow.java:32)
at com.app.starter.Main.main(Main.java:38)
Answer 1

Метод Files.readAllLines использует BufferedReader: добавляет в свой список строки, полученные вызовом метода readLine у reader-a, до тех пор, пока не получит в качестве строки null, что означает окончание потока данных. Звучит логично

Проблема в том, что метод readLine у BufferedReader возвращает null для последней строки, если у неё длина 0 (она пустая). По крайней мере, если судить по исходникам в JDK 1.8.0_131. Баг это или так и задумывалось, и менялось ли это в более новых версиях - не знаю

В итоге если нужно учитывать пустую строку в коде файла, то придётся читать файл более низкоуровневно

READ ALSO
Как выбрать список сущностей с кастомным набором полей через Criteria API, если у сущности есть связанная коллекция других сущностей?

Как выбрать список сущностей с кастомным набором полей через Criteria API, если у сущности есть связанная коллекция других сущностей?

Как выбрать список сущностей с кастомным набором атрибутов через Criteria API, если у сущности есть связанная коллекция других сущностей? ЗдравствуйтеЕсть...

54
Почему Entity - это POJO-класс?

Почему Entity - это POJO-класс?

На википедии черном по белому написано:

75
Заливка ячейки в таблице MS-Wrod по условию

Заливка ячейки в таблице MS-Wrod по условию

Формируется документ Ms-Word форматаdocx

186
Метод, который возвращает объект с неизвестным типом, который хранится в переменной

Метод, который возвращает объект с неизвестным типом, который хранится в переменной

В программировании я довольно молод и неопытенПотому не удаётся мне реализовать одно дельце

106