오늘 한 일

  • java 공부
    • 예외 처리
      • 오류
        컴파일 오류(compile error): 프로그램 코드 작성 중 발생하는 문법적 오류
        실행 오류(runtime error): 실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류

        실행 오류 시 비정상 종료는 서비스 운영에 치명적이다. 오류가 발생할 수 있는 경우에 로그(log)를 남겨 추후 이를 분석하여 원인을 찾아야 한다. 자바는 예외 처리를 통해 프로그램의 비정상 종료를 막고 log를 남길 수 있다.

      • 오류와 예외 클래스
        시스템 오류(error): 자바 가상 머신에서 발생. 프로그래머가 처리할 수 없음.
        ex) 동적 메모리 없는 경우, 스택 오버 플로우 등

        예외(exception): 프로그램에서 제어할 수 있는 오류.
        ex) 읽어들이려는 파일이 존재하지 않는 경우, 네트워크 연결이 끊어진 경우

        error_exception_class

        • 예외 클래스의 종류
          모든 예외 클랫스의 최상위 클래스는 Exception이다.
          다양한 예외 클래스가 제공된다.

          exception_classes

        • try-catch-finally 문
          finally는 try가 수행되면 catch 내의 코드와 관계없이 무조건 실행된다. 따라서 catch 내에서 return; 코드가 작성되어 있더라도 finally 내부의 코드가 실행된다.
          int[] arr = { 1, 2, 3, 4, 5 };
          
          try {
            for (int i = 0; i <= 5; i++) {
              System.out.println(arr[i]);
            }			
          } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e);
            return;
          } finally {
            System.out.println("finally");
          }
          // 1
          // 2
          // 3
          // 4
          // 5
          // java.lang.ArrayIndexOutOfBoundsException: 5
          // finally
          
        • try-with-resources 문
          리소스를 자동 해제하도록 제공해주는 구문으로 Java 7부터 제공된다.
          close()를 명시적으로 호출하지 않아도 try {} 블록에서 열린 리소스는 정상적인 경우와 예외 발생한 경우 모두 자동으로 해제된다. 해당 리소스가 AutoCloseable 인터페이스를 구현해야 한다.
          FileInputStream의 경우 AutoCloseable을 구현하고 있다.
          // try-catch-finally
          FileInputStream fis = null;
          try {
            fis = new FileInputStream("a.txt");
          } catch (FileNotFoundException e) {
            System.out.println(e);
          } finally {
            try {
              fis.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
          
          // try-with-resources
          try (FileInputStream fis = new FileInputStream("a.txt")) {
          } catch (IOException e) {
            System.out.println(e);
          }
          

          Java 9 부터는 try 안에서 사용하고자 하는 리소스를 선언 및 할당하지 않고 외부의 참조 변수를 가져오는 것이 가능하다.

          // from Java 9
          AutoCloseObj obj = new AutoCloseObj();
          try (obj) {
          } catch (Exception e) {
            System.out.println("exception");
          }
          
        • 예외 처리 미루기
          throws를 사용하여 예외 처리를 미룰 수 있다. 메서드 선언부에 throws를 추가하면 예외가 발생한 메서드에서 예외 처리를 하지 않고, 이 메서드를 호출한 곳에서 예외 처리를 해야한다.
          main()에서 throws를 사용하면 가상머신에서 처리된다.

          여러 예외를 한 블록에서 처리 하기

          try {
          
          } catch (FileNotFoundException | ClassNotFoundException e) {
          
          }
          
        • 다중 예외 처리 시 주의사항
          예외가 다양한 경우 가장 최상위 클래스인 Exception 클래스에서 예외를 처리할 수 있다. 이 때 Exception 클래스는 다른 모든 예외 클래스의 최상위 클래스이므로 가장 마지막 블록에 위치해야 한다.
          try {
          
          } catch (FileNotFoundException e) {
          
          } catch (ClassNotFoundException e) {
          
          } catch (Exception e) {
          
          }
          
        • 사용자 정의 예외 클래스 예제
          public class IDFormatException extends Exception {
            public IDFormatException(String message) {
              super(message);
            }
          }
          

참조