티스토리 뷰
Sonarqube로 소스 분석 결과를 보다가 다음과 같은 지적을 받았다.
이게 왜 문제가 된다는거고 심지어 Critical인가?? finally에서 자원 해제도 잘 했는데 왜??
java7 이후부터는 위의 방식처럼 자원을 열고 자원 해제를 위해 finally에서 닫아주고 하는 방식이 아니라 다음과 같이 사용하는 방법을 권고한다고 한다.
try (
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr)
) {
return br.readLine();
} catch (...) {}
즉 try 안에 FileReader, BufferedReader와 같이 자원과 관련된 객체를 만들어 주면 된다. 이렇게 하면 finally에서 이 자원을 해제해주기 위해서 닫아주는 행동을 하지 않아도 된다. 즉 try-catch-finally 에서 try-catch 로 소스가 단순해진다. 그리고 실수할 여지도 없어지니 메모리 누수를 막는데 효과적이다.
그럼 어떤 클래스들이 이렇게 처리가 가능한것일까?
기준점은 바로 Closeable 을 implements를 하고 있느냐 없느냐로 판단하면 된다. 위에서 예를 든 FileReader는 다음과 같은 hierarchy를 가지고 있다.
abstract class인 Reader 를 살펴보면 다음과 같다.
public abstract class Reader implements Readable, Closeable {
위에서 얘기한대로 Closeable을 implements 하고 있다. 이걸 implements 하고 있어야지 try-with-resources가 가능한 것이다.
끝!
'Lang > Java' 카테고리의 다른 글
파일 다운로드 시 Content-Disposition 한글 파일 이름 깨지는 오류 조치 (0) | 2022.01.25 |
---|---|
[Java] java.io.IOException: Stream Closed 오류 조치 (1) | 2022.01.20 |
hs_err_pid 파일은 언제 왜 생성이 되는것일까? (0) | 2021.11.29 |
An illegal reflective access operation has occurred 오류 조치 - 2 (0) | 2021.11.26 |
JAVA UnsupportedClassVersionError 오류 조치 (class file version 확인하기) (0) | 2021.11.24 |
댓글