pej4303 / java-study

자바의 정석 스터디 입니다.
1 stars 1 forks source link

try-catch문, try-with-resources문 예외 처리 여부 #4

Closed pej4303 closed 1 year ago

pej4303 commented 1 year ago
  1. 일반적인 try-catch문 에서 다중 예외가 발생했다면 선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는지 확인 필요
  2. try-with-resources문에서 발생한 예외를 다 catch 하는 것인지 확인 필요
kha212 commented 1 year ago
  1. 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)

kha212 commented 1 year ago

선행 예외는 무시되고 마지막 예외에 대한 내용만 처리되는 것 확인함

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 발생");
        }

    }

}
pej4303 commented 1 year ago

결론

  1. 일반적인 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 발생");
      }
      }
    • 방법1) try-catch-finally
      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)
    • 방법2) try-catch
      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)
  2. try-with-resources문에서 발생한 예외를 다 catch 하는 것인지 확인 필요
    • CloseableResource 객체에서만 발생한 에러를 모두 잡으나, 그 외 에러는 1번과 동일한 결과임