[Java] 예외 처리(Exception Handling)

박채은·2022년 11월 10일
0

Java

목록 보기
30/30

예외 처리

✔️ 프로그램의 비정상적 종료를 방지하고, 정상적인 실행 상태를 유지하기 위한 코드 작성

에러 vs 예외

자바에서는 런타임 시에 잠재적으로 발생할 수 있는 프로그램 오류를 에러와 예외로 구분해서 말한다.

  • 에러(error): 복구하기 어려운 수준의 심각한 오류
    ex) 스택 오버플로우(StackOverflowError), 메모리 부족(OutOfMemoryError)

  • 예외(exception): 잘못된 사용 또는 코딩으로 발생하는 미약한 수준의 오류, 코드 수정 등을 통해서 수습이 가능함

유명한 예외

  • ArithmeticException : 특정 숫자를 0으로 나눴을 때 발생하는 예외
  • FileNotFoundException : 실제로 존재하지 않는 파일을 불러오려 시도할 때 발생하는 예외
  • ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 값을 불러오고자 시도할 때 발생하는 예외
  • NullPointerException : null에 .(포인터)가 찍혔을 때 발생하는 예외

컴파일 에러/런타임 에러

우리는 코딩을 하다보면, 2가지 타입의 에러를 경험한다.

  1. IDE가 코드를 실행하기도 전에, 빨간색 줄을 그어지며 나타나는 에러 = 컴파일 에러
  2. 아무런 경고 없이, 실제로 코드를 실행한 시점에 도달해야 발생하는 에러 = 런타임 에러

말 그대로 컴파일 에러는 컴파일 할 때 발생하는 에러이고, 런타임 에러는 런타임 시에 발생하는 에러이다. 두 에러는 발생 시점이 다르다.

컴파일 에러

  • 세미콜론 생략, 오탈자, 잘못된 자료형, 잘못된 포맷 등 문법적인 문제
    => 신택스 에러라고 부르기도 한다.
  • 자바 컴파일러가 사전에 발생할 수 있는 오류를 감지하고 빨간줄로 주의를 줌

런타임 에러

  • 프로그램이 실행될 때, JVM에 의해 감지됨
  • 보통 개발자의 잘못된 코드 작성으로 발생

예외 클래스

자바는 예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리를 한다.

  • Exception 클래스: 예외의 최상위 클래스
  • 일반 예외 클래스 (Exception)
  • 런타임 예외 클래스 (RuntimeException)

일반 예외 클래스

  • "RuntimeException 클래스와 그 하위 클래스들"을 제외한 모든 exception
  • 컴파일러가 코드 실행 전에, 예외 처리 코드 여부를 검사해서 checked exception이라고 한다.

ex) 잘못된 클래스명(ClassNotFoundException)이나 데이터 형식(DataFormatException) 등

런타임 예외 클래스

  • RuntimeException 클래스와 그 하위 클래스들
  • 컴파일러가 예외 처리 코드 여부를 검사하지 않아, unchecked exception이라고 한다.

ex) 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null인 참조변수 사용(NullPointerException) 등


try-catch문

try {
    // 예외가 발생할 가능성이 있는 코드
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    // finally 블럭은 옵션
    // 예외 발생 여부와 상관없이 항상 실행
}
  • try : 예외가 발생할 가능성이 있는 코드
  • finally : 예외 발생 여부와 상관없이 항상 실행할 코드(옵션)
  • catch : 예외가 발생하는 경우에 실행되는 코드

catch문

catch (NullPointerException e) {
	// 구체적인 예외-1 
}
catch (ArithmeticException e) {
	// 구체적인 예외-2
}
catch (Exception e) {
	// 모든 예외를 받음
}

catch 블럭이 여러 개인 경우, 블럭은 위에서부터 순차적으로 검사를 진행하며, 일치하는 하나의 catch 블럭만이 실행된다.

따라서 구체적인 하위 예외 클래스를 위에 배치하고, 상위 예외 클래스가 나중에 실행되도록 작성해야 한다!

일치하는 블럭을 찾으면, 예외처리 코드가 종료되거나 finally 블럭으로 넘어간다.
만약에 일치하는 블럭을 찾지 못하면, 예외는 처리되지 않는다.


에러 정보 출력

catch (Exception e) {
            System.out.println("e.getMessage: " + e.getMessage());
            System.out.println("e.toString: " + e.toString());
            e.printStackTrace();
} 
  • e.getMessage()
  • e.toString()
  • e.printStackTrace()

-> 자세한 내용은 공부해서 추가해주기!

throws/throw

  • throws: 예외를 전가하는 것
  • throw: 예외를 의도적으로 발생시키는 것

0개의 댓글