Closed pej4303 closed 1 year ago
try-with-resources문에서 발생한 예외를 다 catch 하는 것인지 확인
public class Issue_java {
public static void main(String[] args) {
// TODO Auto-generated method stub
/* 1. 일반적인 try-catch문 에서 다중 예외가 발생했다면 선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는지 확인 필요
2. try-with-resources문에서 발생한 예외를 다 catch 하는 것인지 확인 필요 */
//try () 안에서 생성한 객체는, 별도로 close()를 호출하지 않아도 try 블록 종료 후 자동 호출됨
try (CloseableResource cr = new CloseableResource()) {
cr.exceptionWork(true);
} catch(IOException | NullPointerException e) { // or 가 아니라서 둘 다 출력됨
e.printStackTrace();
} finally {
System.out.println("finally 호출");
throw new RuntimeException("RuntimeException 발생");
}
}//main end
}//Issue_java end
class CloseableResource implements AutoCloseable { public void exceptionWork(boolean exception) throws IOException { System.out.println("exceptionWork 호출"); if (exception) throw new IOException("IOException 발생"); }
public void close() throws NullPointerException{
System.out.println("CloseException 호출");
throw new NullPointerException("NullPointerException 발생");
}
}
[실행결과]
exceptionWork 호출 CloseException 호출 java.io.IOException: IOException 발생 finally 호출 at CloseableResource.exceptionWork(Issue_java.java:27) at Issue_java.main(Issue_java.java:12) Suppressed: java.lang.NullPointerException: NullPointerException 발생 at CloseableResource.close(Issue_java.java:32) at Issue_java.main(Issue_java.java:13) Exception in thread "main" java.lang.RuntimeException: RuntimeException 발생 at Issue_java.main(Issue_java.java:17)
선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는 것 확인함
import java.io.IOException;
public class Issue_java2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
/* 1. 일반적인 try-catch문 에서 다중 예외가 발생했다면 선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는지 확인 필요
2. try-with-resources문에서 발생한 예외를 다 catch 하는 것인지 확인 필요 */
//try () 안에서 생성한 객체는, 별도로 close()를 호출하지 않아도 try 블록 종료 후 자동 호출됨
try {
throw new RuntimeException("NullPointerException 발생");
} catch(NullPointerException e) { // or 가 아니라서 둘 다 출력됨
e.printStackTrace();
System.out.println("catch 호출");
throw new IOException("IOException 발생");
} finally {
System.out.println("finally 호출");
throw new RuntimeException("RuntimeException 발생");
}
}
}
일반적인 try-catch문 에서 다중 예외가 발생했다면 선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는지 확인 필요
try에서 발생한 예외는 다 나오고 방법1)처럼 finally이 있는경우 finally에서 발생한 예외만 나오고 방법2)처럼 catch만 있는경우에는 catch에서 발생한 예외만 나오는 것을 확인 할 수 있음
public class CloseableResource implements AutoCloseable {
public void exceptionWork(boolean exception) throws IOException {
System.out.println("exceptionWork 호출");
if (exception) {
throw new IOException("IOException 발생");
}
}
@Override
public void close() throws CloseException {
System.out.println("CloseException 호출");
throw new NullPointerException("NullPointerException 발생");
}
}
try (CloseableResource cr = new CloseableResource()) {
cr.exceptionWork(true);
} catch (IOException | NullPointerException e) { // or 가 아니라서 둘 다 출력됨
e.printStackTrace();
System.out.println(1/0); // 예외 발생
} finally {
System.out.println("finally 호출");
throw new RuntimeException("RuntimeException 발생");
}
[실행결과]
exceptionWork 호출
CloseException 호출
java.io.IOException: IOException 발생
at issues.CloseableResource.exceptionWork(CloseableResource.java:12)
at issues.Issue_java.main(Issue_java.java:17)
Suppressed: java.lang.NullPointerException: NullPointerException 발생
at issues.CloseableResource.close(CloseableResource.java:20)
at issues.Issue_java.main(Issue_java.java:18)
finally 호출
Exception in thread "main" java.lang.RuntimeException: RuntimeException 발생
at issues.Issue_java.main(Issue_java.java:23)
try (CloseableResource cr = new CloseableResource()) {
cr.exceptionWork(true);
} catch (IOException | NullPointerException e) { // or 가 아니라서 둘 다 출력됨
e.printStackTrace();
System.out.println(1/0); // 예외 발생
}
[실행결과]
exceptionWork 호출
CloseException 호출
java.io.IOException: IOException 발생
at issues.CloseableResource.exceptionWork(CloseableResource.java:12)
at issues.Issue_java.main(Issue_java.java:17)
Suppressed: java.lang.NullPointerException: NullPointerException 발생
at issues.CloseableResource.close(CloseableResource.java:20)
at issues.Issue_java.main(Issue_java.java:18)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at issues.Issue_java.main(Issue_java.java:20)