Search
Duplicate

[JAVA] NPE 발생 (1)

순서
2
날짜
2022/10/20
사람
상태
Done
2022.
12.01 작성
개발서버에서 이미지를 다운받을때 직접 받을 수 없기 때문에, 이미지를 프록시 서버에서 다운을 받은후에 개발서버에서 프록시 서버의 이미지를 다운받는다. 다운받을때 방어코드와 try catche가 잘못되서 계속 에러가 발생하였고, 이를 해결하기 위해서는 방금 언급한 방어코드 + try catche를 잘 해줘야된다.
그리고 한가지 더 작업을 하면서 확인한것은 log를 잘 작성해야 된다는 것이다. 에러가 발생했지만 잘못된 try catch로 어느 부분에서 문제가 발생하는지 찾기가 어려웠다.
try { ResponseEntity<Resource> responseEntity = new RestTemplate(new SimpleClientHttpRequestFactory()).exchange(uri, HttpMethod.GET, null, Resource.class); InputStream in = responseEntity.getBody().getInputStream(); fileBytes = IOUtils.toByteArray(in); } catch (RestClientException re| IOException io) { log.error("fail. tracking info {}", new InternalLogger(CrudType.READ, uri.getPath(), rce)) }
Java
복사
1) responseEntity.getBody 를 할때 값을 체크해서, 해당하는 값이 있는지 체크를 해야된다. 무조건 있다고 생각되서 getBody를 한순간 없는 파일의 getBody를 가져오기때문에.
2) catch 에서 re, io 익셉션을 잘잡았지만, RuntimeException을 잡지 않았기때문에, 해당하는 값이 널값으로 왔을때 RuntimeException이 발생하면서 로그에 찍히지 않고 익셉션일 발생하였다.
두 개의 큰 문제점이 있었고, 해결방법으로는 1) 방어코드 추가와 2) catch 추가
try { ResponseEntity<Resource> responseEntity = new RestTemplate(new SimpleClientHttpRequestFactory()).exchange(uri, HttpMethod.GET, null, Resource.class); if (Objects.isNull(responseEntity.getBody())) { return new byte[0]; } InputStream in = responseEntity.getBody().getInputStream(); fileBytes = IOUtils.toByteArray(in); } catch(RestClientException | IOException rce) { log.error("fail. tracking info {}", new restLogger(DataType.READ, uri.getPath(), rce)); } catch (RuntimeException runtimeException) { log.error("fail. tracking info {}", new restLogger(DataType.READ, uri.getPath(), runtimeException)); }
Java
복사
여기서, 배워야 할 점은, RestClientExceptionIOException io 같은 경우 restLogger 객체를 생성해서 안에 명시해주고 toString을 적시해, 어떤 로그가 발생되는지 명확하게 해줬다는 점이다. 물론 오류도 중요하지만, 정확하게 명시해주는 로그는 나중에 큰 도움이 될 것으로 판단된다.