프로그램 실행 시에 발생할 수 있는 예기치 못한 예외의 발생에 대비하여 코드를 작성하는 것이다.
예외와 오류는 엄연히 다른 개념이다.
예외(Execption): 프로그램 내에서 처리 가능한 예측 가능한 문제
FileNotFoundException 파일 없음
ArrayIndexOutOfBoundsException 배열 인덱스 초과
NumberFormatException 숫자 형식 변환 실패
오류(Error): 시스템 레벨에서 발생하는 복구나 처리하기가 어려운 문제
OutOfMemoryError 메모리 부족
StackOverflowError 스택 오버플로우
NoClassDefFoundError 클래스 로드 실패
Throwable 클래스에서 예외와 오류를 나눠놓은 것을 볼 수 있다.

자바에서는 예외를 두 가지 유형으로 분류할 수 있다.
컴파일 시점에서 반드시 처리해야 하는 예외
외부 환경과 상호작용할 때 발생할 가능성이 있다.
처리 하지 않으면 컴파일 오류가 발생한다.
try-catch 구조를 사용하여 예외 처리를 한다.
IOException, SQLException, ...
대부분 프로그래머의 실수로 발생하는 예외
예외 처리를 하지 않아도 컴파일 오류가 발생하지 않는다.
런타임 중에 오류가 발생한다.
NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException, ...
try 블록catch 블록으로 이동한다.catch 블록try 블록에서 발생한 특정 예외를 처리하는 코드이다.catch 블록이 실행된다.finally 블록finally 블록은 생략이 가능하다. public class MultipleCatchExample {
public static void main(String[] args) {
try {
String str = null;
System.out.println(str.length()); // NullPointerException 발생
} catch (ArithmeticException e) {
System.out.println("산술 예외 발생: " + e.getMessage());
} catch (NullPointerException e) {
System.out.println("널 포인터 예외 발생: " + e.getMessage());
} finally {
System.out.println("프로그램 종료 전 정리 작업");
}
}
}
> Output
널 포인터 예외 발생: Cannot invoke "String.length()" because "str" is null
프로그램 종료 전 정리 작업
public static void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("나이는 18세 이상이어야 합니다."); // 예외 발생
}
System.out.println("나이는 적합합니다.");
}
public static void readFile(String fileName) throws FileNotFoundException
예외는 비용이 높은 작업이기 때문에, 논리 흐름 제어에 사용하게 되면 성능이 저하된다.
예외 처리가 필요한 부분에서만 사용해야 한다.