#java #файлы #java_ee
Добрый день, возникла очень не понятная ошибка... Дело в том, что у меня некоторые данные хранятся в файле, при развертывании TomCat происходит удачное считывание с файлов. Но также у меня есть админка - там у пользователя есть возможно изменить данные в файле, после перезаписывании данных вылетает исключение(NullPointerException) видите ли такого файла не существует, хотя он находится там я проверял... Вообще не понятная ситуацию, вот методы для записи и чтение данных из файла: Считывание public synchronized String readFile(String filePath){ StringBuffer txt = new StringBuffer(); Listlines = null; try { lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); } catch (IOException e) { log.error("Error reading from: " + filePath); } catch (NullPointerException e){ log.error("Incorrect path : " + filePath); } for(String line: lines){ txt.append(line); } return txt.toString(); } Запись public synchronized void writeFile(String filePath, String data){ try { FileWriter out = new FileWriter(filePath, false); out.write(data); out.close(); } catch (IOException e) { log.error("Error writing to file: " + filePath); } } Надеюсь, что кто-нибудь подскажет какая причина этого, потому что сам уже 2-ой день бьюсь с этим. Вот собственно ошибки, которые мне выдаются: Type Exception Report Message An exception occurred processing JSP page [/admin_room.jsp] at line [39] Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception org.apache.jasper.JasperException: An exception occurred processing JSP page [/admin_room.jsp] at line [39] 36:
Ответы
Ответ 1
У вас имеется следующий код, где вы ловите исключения в случае, если что-то пошло не так при чтении файла: try { lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); } catch (IOException e) { log.error("Error reading from: " + filePath); } catch (NullPointerException e){ log.error("Incorrect path : " + filePath); } Однако после обработки этих исключений переменная lines остаётся со значением null - и при последующей попытке обхода мы получаем NullPointerException: for(String line: lines){ txt.append(line); } Скорее всего, данный обход списка тоже нужно перенести внутрь блока try-catch. P.S.: И при обработке IOException желательно сохранить исходное сообщение - по нему будет проще понять, что пошло не так: catch (IOException e) { log.error(String.format("Error reading from file '%s': %s", filePath, e.getMessage())); } P.P.S.: Кстати, можно упростить метод чтения: public synchronized String readFile(String filePath){ try { return Files .lines(Paths.get(filePath), StandardCharsets.UTF_8) .collect(Collectors.joining()); } catch (IOException e) { ... } }Ответ 2
Я бы проще сделал так: public synchronized String readFile(String filePath){ StringBuffer txt = new StringBuffer(); try { Listlines = null; lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); for(String line: lines){ txt.append(line); } } catch (IOException | NullPointerException e) { log.error("Error reading from file: " + filePath); } return txt.toString(); } т.е. все в один блок try, кроме txt. В случае ошибки, метод вернет пустую строку и отпишет об этом в лог (наверное, предполагалось именно это).
Комментариев нет:
Отправить комментарий