-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
🐳 02 Objects2장 객체 생성과 파괴2장 객체 생성과 파괴
Description
Chapter : 2. 객체 생성과 파괴
Item : 9. Try-finally 대신 Try-with-Resource 사용하라.
Assignee : youngkimi
🍑 서론
- Java 7에서 등장한 Try-with-Resource.
- Try-finally 보다 간결한 코드, 편리한 자원 할당, 디버깅에 이점이 있다.
🍑 본론
Try-Finally 구문의 문제
- 코드가 장황하다.
- 나중에 발생한 에러가 먼저 발생할 에러를 덮어버린다.
예시 코드
MyResource
public class MyResource implements AutoCloseable {
public void doSomething() throws FirstError {
System.out.println("Do Something");
throw new FirstError();
}
@Override
public void close() throws SecondError {
System.out.println("Clean My Resources");
throw new SecondError();
}
}AppRunner
public class AppRunner {
public static void main(String[] args) {
MyResource myResource = new MyResource();
try {
myResource.doSomething(); // 에러 발생. finally로 이동.
MyResource myResource1 = null;
try {
myResource1 = new MyResource();
myResource1.doSomething();
} finally {
if (myResource1 != null)
myResource1.close();
}
} finally {
myResource.close();
}
}
}실행 결과
다음과 같이 나중에 발생한 에러(Second Error)가 먼저 발생한 에러(First Error)를 덮어버린다.
하지만 디버깅 측면에서 정말 관심이 있는 것은 먼저 발생한 에러이다.
Try-with-Resource
public class AppRunner2 {
public static void main(String[] args) {
try (MyResource myResource = new MyResource()) {
myResource.doSomething();
try (MyResource myResource1 = new MyResource()) {
myResource1.doSomething();
}
}
}
}- 코드가 간결해진 모습.
- 위에서 발생했을법한 NPE도 깔끔하게 처리할 수 있다.
실행 결과
- 원하는 결과대로 **먼저 발생한 에러(First Error)**가 출력된다.
- 에러 발생 지점을 정확하게 찾을 수 있다.
- 이후 발생한 에러는 Suppressed 되어 표시해준다.
- 아래와 같이 동시 할당도 가능하다.
- 이 경우에는 두 resource 모두 close 해준다.
public class AppRunner2 {
public static void main(String[] args) {
try (MyResource myResource = new MyResource();
MyResource myResource1 = new MyResource()) {
myResource.doSomething();
myResource1.doSomething();
}
}
}🍑 결론
- 인텔리제이 최고!
Referenced by
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🐳 02 Objects2장 객체 생성과 파괴2장 객체 생성과 파괴



