Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Ошибка чтения/записи при работе с файлом(Java EE)

#java #файлы #java_ee


Добрый день, возникла очень не понятная ошибка... Дело в том, что у меня некоторые
данные хранятся в файле, при развертывании TomCat происходит удачное считывание с файлов.
Но также у меня есть админка - там у пользователя есть возможно изменить данные в файле,
после перезаписывании данных вылетает исключение(NullPointerException) видите ли такого
файла не существует, хотя он находится там я проверял... Вообще не понятная ситуацию,
вот методы для записи и чтение данных из файла:

Считывание

public synchronized String readFile(String filePath){
    StringBuffer txt = new StringBuffer();
    List lines = 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:                 
37:
38: 39: "> 40:
41:
42: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException ru.tidstu.testingsystem.models.IOFile.readFile(IOFile.java:33) ru.tidstu.testingsystem.models.FactoryModels.getCommonData(FactoryModels.java:107) org.apache.jsp.admin_005froom_jsp._jspService(admin_005froom_jsp.java:152) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


Ответы

Ответ 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 { List lines = 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. В случае ошибки, метод вернет пустую строку и отпишет об этом в лог (наверное, предполагалось именно это).

Комментариев нет:

Отправить комментарий