Skip to content

Item 9. Try-finally 대신 Try-with-Resource 사용하라. #9

@youngkimi

Description

@youngkimi

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();
        }
    }
}

실행 결과

try-finally_error_result

다음과 같이 나중에 발생한 에러(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도 깔끔하게 처리할 수 있다.

실행 결과

try-with-resource_error_result

  • 원하는 결과대로 **먼저 발생한 에러(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();
        }
    }
}

try-with-resource_error_result2

인텔리제이에서 수정 하라고 알려준다.
try-with-resource_intellij

🍑 결론

  • 인텔리제이 최고!

Referenced by

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions