자원 : 모든 Link
첫째, try-with-resources
실제로 처리하지 않는 Exceptions
(이 기록하여 코드에서 수행처럼). 기본적으로 try-catch-finally
구조체에서 처리 할 수있는 객체로 Exceptions
을 던져 넣은 이 포함되어 있습니다. Exceptions
이 포함되어 있습니다.
try
블록이 Exception
을 throw하면 리소스가 닫히고 결과는 Exception
이 표시되지 않습니다. 따라서 던진 Exception
개체는 억제 된 Exception
에 대한 참조를 갖게됩니다.
try
블록이 Exception
을 던지지 않으면 리소스가 닫히고 Exception
이 다시 처리됩니다.
따라서 우리는 당신의 예 하지 동일하다는 것을 결론을 내릴 수 있습니다
사용 try-catch-finally
Exception
동안 같은 try-with-resources
문, 그냥 가까운 오류 '로 처리됩니다 성공적으로 처리 한 후 폐쇄에 의한 Exception
것 실제 처리에서 발생한 Exception
과 동등하게 처리되어야합니다.
TL; DR
자원의 폐쇄를 처리하는 것이 더 물건를 포함하는 경우 try-with-resources
문은 좋은 오래된 try-catch-finally
로 발생하지 않는 버그를 생성 할 수 있습니다. 예를 들어 내용이 인 경우 jdbc
연결을 커밋하고 롤백하는 것입니다.그래서
는 마침내 정확한 상응하는 것
try(Resource resource = new Resource()){
// other code
}
를 들어, 어떤 코드를 생성합니다 :
{
Resource resource = null;
Exception exc = null;
try {
resource = new Resource();
// other code
} catch (Exception e) {
exc = e;
throw e;
} finally {
if (resource != null) {
if (exc != null) {
try {
resource.close();
} catch (Throwable t) {
exc.addSuppressed(t);
}
} else {
resource.close();
}
}
}
}
내가 알고있는 것처럼 [JLS 14.20.3] (https://docs.oracle.com/javase/specs/jls/se8/ html/jls-14.html # jls-14.20.3)'리소스가 null이 아닌 값으로 초기화 된 경우에만 닫힙니다. ', finally 블록에서'resource! = null'을 확인해야합니다. 내가 잘못? – Bedla
네 말이 맞아. 편집 할게. 이것이'try-with-resources' 문을 사용해야하는 이유의 좋은 예라고 생각합니다. 자주 재현하려고하면 버그가 발생합니다. – Izruo