2024. 1. 30. 02:40ㆍJava
예외 (Exception) 란?
예외란 프로그램 실행 과정 또는 프로그램 실행 이후에 기대하지 않은, 또는 원치 않는 프로그램의 동작을 의미한다.
예외는 프로그램에 의해 예외 객체를 생성함으로써 처리할 수 있다.
예외처리란 무엇인가
자바에서 예외처리가 갖는 가장 큰 의미는 자바 프로그램이 실행되는 동안(런타임) 발생하는 예외를 핸들링하여 프로그램이 자연스러운 방향으로 동작하게 하기 위함이다.
자바에서 지원하는 대표적인 런타임 에러들은 ClassNotFoundException, IOException, SQLException, RemoteException 등이 있다.
Exception 이 발생하는 대표적인 케이스
- 유저의 부적절한 입력
- 호환되지 않는 장치
- 네트워크 연결 유실
- 물리적 제한 (메모리 부족 등)
- 코드 에러
- 이용 불가능한 파일 접근
예외 (Exception) 와 에러 (Error) 의 차이점
- 에러 : 프로그램의 심각한 문제점으로, 일반적으로 실행 전에 잡아낼 수 없다.
- 예외 : 프로그램이 의도하는 조건으로, 일반적으로 실행 전에 분류해둔다.
자바의 예외 계층
자바에서 모든 예외나 에러는 Throwable 이라는 클래스의 상속 구현체이다.
- Exception 클래스는 유저 프로그램에서 처리한 예외를 catch 한다. 예를 들어 NullPointerException이 있다.
- Error 클래스는 자바 런타임 환경 (JRE) 에서 발생하는 에러에 사용된다. 예를 들어 StackOverFlowError가 있다.
예외의 분류
내장 예외 (Built-in Exception)
자바 라이브러리에 의해 처리되는 예외들이다.
- 처리된 예외 (Checked Exception) : 컴파일 시점에 이미 처리 완료되어 있는 예외들이다. IOException 등이 있다.
- 처리되지 않은 예외 (Unchecked Exception) : 런타임에 발생하는 예외들이다. NullPointerExcetpion 등이 있다.
유저 정의 예외
프로그램 흐름상 특정 케이스에 대한 유저의 동작을 차단할 필요가 있는 경우 개발자가 직접 산정하는 예외이다.
자바에서 제공하는 예외처리 체계를 활용하면 여러 장점이 있다.
- 프로그램의 완성도 향상
- 프로그램 코드와 예외 처리 코드의 쉬운 구분
- 에러의 전파
- 에러의 보고
- 에러의 분류
예외처리된 정보를 출력하는 방법
printStackTrace()
toString()
getMessage()
int a = 5; int b = 0; try { System.out.println(a / b); } catch (ArithmeticException e) { e.printStackTrace(); System.out.println(e.toString()); System.out.println(e.getMessage()); }
JVM 은 예외를 어떻게 핸들링하는가
기본 예외 처리
메서드 실행 중 예외가 발생하면, 메서드는 Exception 객체를 만들어 JVM (자바 런타임 시스템) 에 전달한다.
Exception 객체에는 예외의 이름, 예외의 상세 정보, 예외가 호출된 위치 등이 담겨 있다.
그리고 예외가 발생한 메서드를 호출한 메서드들이 배열로 담겨있는데, 그것을 콜 스택 (Call Stack)이라 한다.
JVM은 콜 스택을 검색하여 발생한 예외를 처리할 수 있는 에러 핸들러(Error handler)를 찾는다.
JVM은 예외가 발생한 메서드 계층의 역순으로 (스택이므로) 검색하여 위치를 찾는다.
발생한 예외를 처리하는 것으로 구현된 에러 핸들러를 발견하게 되면, 예외가 발생한 것으로 처리하고 종료한다.
콜 스택을 전부 검색하여도 발생한 예외를 처리하는 에러핸들러를 발견하지 못한 경우, JVM은 디폴트 에러핸들러(Default Exception Handler)에게 예외를 전파하고 프로그램을 종료시킨다.
String str = null; System.out.println(str.length());
프로그래머의 예외 핸들링
커스터마이징된 예외 처리
try ~ catch ~ finally 구문을 이용한다.
try : 실행하고 싶은 구문
catch : 처리하고 싶은 예외
finally : 예외처리와 관계 없이 반드시 실행되어야 하는 구문
int[] arr = new int[4]; int i = arr[4]; System.out.println("Need to execute"); // 실행되지 않는다 try { int[] arr2 = new int[4]; int i = arr2[4]; } catch (Exception e) { throw e; } finally { System.out.println("Need to execute"); // 실행된다 }
Resources
'Java' 카테고리의 다른 글
자바의 클래스(Class)와 객체(Object) (1) | 2024.02.01 |
---|---|
자바와 자료구조 (0) | 2024.01.30 |
자바의 반복문 (0) | 2024.01.28 |
자바의 함수와 메서드 (1) | 2024.01.27 |
자바의 조건문 (0) | 2024.01.27 |