Spring & Java
예외 ( Exception )과 예외처리 (try-catch) 본문
● 예외 ( Exception )과 예외처리 (try-catch)
예외 ( Exception )과 예외처리 (try-catch)
학습 키워드 점검
예외 ( Exception ) - 프로그램 실행 중 예상하지 못한 상황
예외처리 ( try-catch) - 예외 발생 시 프로그램 종ㄽ를 방지하고 처리
예외종류
● 체크 예외 ( Exception ) - 컴파일러가 예외처리를 강제하는 예외
● 언체크 예외( RuntimeException ) - 컴파일러가 예외처리를 강제하지 않는 예외
예외 ( Exception )란 ?
● 예외는 프로그램 실행 중 예상하지 못한 상황이 발생하는 것을 의미합니다.
> 커피 쏟기
> 대표적인 산술 예외 : 10 / 0 * 0으로 나누기 등
● 의도적으로 예외를 발생시킬 떄는 throw 키워드를 통해 발생시킵니다.
● 예외를 처리하지 않으면 프로그램이 중단될 수 있습니다.
● 그래서 예외처리 ( Try-catch ) 를 통해 프로그램이 안정적으로 실행되게 할 수 있습니다.
예외 발생 예제
1. 의도하지 않은 예외
● 아래 코드에서 10 / 0 연산을 수행하면서 ArithmeticException (산술예외)가 발생합니다.
● 0으로 나누는 연산은 허용되지 않음으로 프로그램이 비정상적으로 종료됩니다.
● 예외를 처리하지 않으면 이후 코드는 실행되지 않습니다.
public class Main {
public static void main(String[] args) {
System.out.println("프로그램 시작");
int result = 10 / 0; // ❌ 예외 발생 (ArithmeticException)
System.out.println("이 문장은 실행되지 않음");
}
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
at chapter3.exception.Main.main(Main.java:8)
Process finished with exit code 1
2. 의도적인 예외 - throw
● 특정 조건에서 의도적으로 예외를 발생시킬 수도 있습니다.
ㄴ ○ 비즈니스 규칙을 위반한 경우 ( 미성년자접근 )
● 아래 코드에서 age < 18 조건을 만족하면 IlleaglArgumentException을 발생시킵니다.
● thorw를 활용하면 특정 상황에서 예외를 명확하게 정의하고 제어할 수 있습니다.
public class Main {
public static void main(String[] args) {
int age = 10;
if (age < 18) {
// ✅ 의도적으로 예외를 발생시키는 부분
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
System.out.println("....");
}
}
예외 구조와 종류
예외 구조와 종류에 대해서 학습해 봅시다.
● RuntimeException - UncheckedException
ㄴ ○ RuntimeException 을 상속받는 모든 예외를 UncheckedException이라고 합니다.
ㄴ ○ 예외처리를 컴파일러가 확인하지 않습니다.
● Exception - CheckedException
ㄴ ○ Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 합니다. RuntimeException과 RuntimeException을 상송받은 예외는 제외합니다.
ㄴ ○ 예외처리를 컴파이럴가 확인해 줍니다.

예외 전파
예외 전파에 대해서 알아봅시다.
● 예외 전파는 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때 메서드를 호출한 상위 메서드로 전달되는 과정을 말합니다.
● 예외가 프로그램 시작지점 ( main () ) 까지 전파되고 끝내 처리되지 않으면 프로그램이 비정상 종료 됩니다.
● 예외 전파를 RuntimeException 그리고 Exception 예시를 통해 알아봅시다.
RuntimeException - UncheckedException
UncheckedException을 학습해 봅시다.
● 컴파일러가 예외 처리를 강제한지 않는 예외입니다.
● 예외 처리를 하지 않아도 컴파일 오류 (빨간 줄)가 발생하지 않습니다.
● 처리되지 않은 예외는 계속 프로그램 시작 시점까지 전파됩니다.
● 끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료됩니다.
● RuntimeException을 상속받는 모든 예외를 UncheckdeException이라고 합니다.
1. Try - catch 활용
public class ExceptionPractice {
public void callUncheckedException() {
if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // ✅ 예외발생
}
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 언체크 예외 호출
exceptionPractice.callUncheckedException();
// ❌ 예외처리를 해주지 않았기 때문에 프로그램이 종료됩니다.
System.out.println("이 줄은 실행되지 않습니다.");
}
}
public class Main {
public static void main(String[] args) {
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 상위로 전파된 예외처리
try {
exceptionPractice.callUncheckedException();
} catch (RuntimeException e) { // ✅ 예외처리
System.out.println("언체크 예외 처리");
} catch (Exception e) {
System.out.println("체크 예외 처리");
}
System.out.println("프로그램 종료");
}
}
Exception - CheckedException
CheckedException을 학습해 봅시다.
● Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 합니다.
ㄴ ○ RuntimeException을 상속받는 예외는 제외.
● 컴파일러가 예외 처리를 강제하는 예외입니다.
● 예외 처리를 하지 않으면 " 컴파일 오류가 발생한다 (코드에 빨간줄) " 라고 이해하면 쉽습니다.
● 반드시 try - catch 로 예외를 처리하거나 throws 키워드를 사용해야합니다.
- > throws 로 예외 처리의 책임을 호출가에게 전가할 수 있습니다.
[ 1 ] try - catch 활용
● CheckedException을 try - catch를 사용하여 직접처리하는 방식입니다.
public class ExceptionPractice {
public void callCheckedException() {
// ✅ try-catch 로 예외 처리
try {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
} catch (Exception e) {
System.out.println("예외 처리");
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 체크예외 호출
exceptionPractice.callCheckedException();
}
}
[ 2 ] throws 활용
● throws 키워드를 사용하여 예외를 호출한 곳에서 처리하도록 강제하는 방식입니다.
- > 책임 전가
public class ExceptionPractice {
public void callCheckedException() throws Exception { // ✅ throws 예외를 상위로 전파
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
}
}
package chapter3.exception;
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// 체크 예외 사용
// ✅ 반드시 상위 메서드에서 try-catch 를 활용해 주어야합니다.
try {
exceptionPractice.callCheckedException();
} catch (Exception e) {
System.out.println("예외처리");
}
}
}
배운 내용을 정리해 봅시다.
● 예외가 발생하고 처리되지 않으면 프로그램이 비정상적으로 종료될 수 있기 때문에 꼭 예외 처리는 필수입니다.
● CheckedException 은 컴파일러를 통해 개발자에게 반드시 처리해야 하는 예외를 알려줄 수 있습니다.
● UncheckException 은 개발자가 충분히 예측하고 방지할 수 있는 경우 사용합니다.
- > 숫자를 0으로 나누는 오류 등은 코드 검토로 충분히 예방 가능합니다.
- > 이런 예외처리까지 CheckedException 으로 처리하도록 강제한다면 모든 예외 상황을 처리해야 하는 답답한 상황이 벌여져 개발 생산성이 저하되고 불필요한 코드가 많아질 수 있습니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
try {
System.out.print("아이디 입력: ");
String username = scanner.next();
System.out.print("비밀번호 입력: ");
String password = scanner.next();
login(username, password); // 예외 발생 가능
System.out.println("로그인 성공!");
break;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public static void login(String username, String password) throws Exception {
if (!username.equals("admin") || !password.equals("1234")) {
throw new Exception("로그인 실패! 아이디 또는 비밀번호가 잘못되었습니다.");
}
}
}
'JAVA 개념 확장' 카테고리의 다른 글
| 스트림 ( Stream ) (0) | 2025.12.18 |
|---|---|
| 람다 (Lambda) (0) | 2025.12.17 |
| 제네릭 ( Generic ) (0) | 2025.12.15 |
| 컬렉션 ( Collection ) (0) | 2025.12.15 |
| Optional - null을 다루는 법 (0) | 2025.12.12 |