오류란?

  • 컴파일 오류 (compile error) : 프로그램 코드 작성 중 발생하는 문법적 오류
  • 실행 오류 (runtime error) : 실행 중인 프로그램이 의도하지 않은 동작을 하거나 (bug) 프로그램이 중지되는 오류
  • 실행 오류 시 비정상 종료는 서비스 운영에 치명적임
  • 오류가 발생할 수 있는 경우에 로그를 남겨 추후 이를 분석하여 원인을 찾아야 한다.
  • 자바는 예외처리를 통하여 프로그램의 비정상 종료를 막고 로그를 남길 수 있다.

오류와 예외 클래스

  • 시스템 오류(error) : 가상 머신에서 발생, 프로그래머가 처리할 수 없음, 동적 메모리가 없는 경우, 스택 오버플로우 등
  • 예외 (Exception) : 프로그램에서 제어할 수 있는 오류, 읽어들이려는 파일이 존재하지 않는 경우, 네트워크 연결이 끊어진 경우


예외 클래스 종류

  • 모든 예외 클래스의 최상위 클래스는 Exception
  • 다양한 예외 클래스가 제공됨
  • Class Exception : java.lang.Object -> java.lang.Throwable -> java.lang.Exception

 


try-catch문 사용

public class ExceptionTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("a.txt");
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                System.out.println(e);
            } finally {
                System.out.println("finally");
            }
        }
    }
}

try-catch-finally

  • finally에서 프로그램 리소스를 정리함
  • try{} 블럭이 실행되면 finally{} 블록은 항상 실행됨
  • 리소스를 정리하는 코드를 각 블록에서 처리하지 않고 finally 에서 처리함

try-with-resources문

  • 리소스를 자동 해제 하도록 제공해주는 구문
  • 자바 7부터 제공
  • close()를 명시적으로 호출하지 않아도 try{} 블록에서 열린 리소스는 정상적인 경우, 예외를 발생한 경우 모두 해제됨
  • 해당 리소스가 AutoCloseable을 구현해야 함
  • FileInputSteam의 경우 AutoCloseable을 구현하고 있음

  • AutoCloseable 구현 및 사용

  • throws 구현부에게 예외처리를 위임
  • main 메소드에서 try/catch로 예외처리
  • 어떤 Exception을 예외처리할지 모르는 경우, 최상위 클래스인 Exception 클래스를 catch 구문에 넣기


향상된 try-with-resource 문

  • 자바 9 에서 제공되는 구문
  •  외부에 선언된 리소스도 변수만 사용 가능


예외 처리 미루기

  • throws를 사용 하여 예외처리 미루기
  • 메서드 선언부에 throws를 추가
  • 예외가 발생한 메서드에서 예외 처리를 하지 않고 이 메서드를 호출한 곳에서 예외처리를 함
  • main()에서 throws를 사용하면 가상머신에서 처리된다.
  • throw는 예외처리 발생 / throws 는 예외처리를 미루는 것

다중 예외 처리 시 주의사항

  • 예외가 다양한 경우 가장 최상위 클래스인 Exception 클래스에서 예외를 처리할 수 있음
  • 단, Exception 클래스는 모든 예외 클래스의 최상위 클래스이므로 가장 마지막 블록에 위치해야 함
ThrowException ex = new ThrowException();
        try {
            ex.loadClass("b.txt", "java.lang.string");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

사용자 정의 예외

  • JDK에서 제공되는 예외 클래스 외에 사용자가 필요에 의해 예외 클래스를 정의하여 사용
  • 기존 JDK 예외 클래스 중 가장 유사한 클래스에서 상속
  • 기본적으로 Exception에서 상속해도 된다.
  • 전달 받은 아이디의 값이 null 이거나 8자 이하 20자 이상인 경우 예외를 발생시켜 보자

'Back-end > java' 카테고리의 다른 글

스터디 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2021.06.24
자바 입출력  (0) 2021.06.24
스트림  (0) 2021.06.23
람다식  (0) 2021.06.23
내부클래스  (0) 2021.06.23

+ Recent posts