📙 목차
🧡 학습 목표
- Java의 예외처리에 대해서 학습한다.
1. 예외(Exception)
예외(Exception)란?
- 프로그램 실행 중 예상하지 못한 상황이 발생하는 것
- 의도적으로 예외를 발생시킬 때는 throw 키워드를 통해 발생시킨다.
- 예외를 처리하지 않으면 프로그램이 중단될 수 있다.
- 예외처리(try-catch)를 통해 프로그램이 안정적으로 실행되게 할 수 있다.
예외 발생 예제
- 의도하지 않은 예외
- 아래 코드에서 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
- 의도적인 예외 - throw
- 특정 조건에서 의도적으로 예외를 발생시킬 수도 있다.
- 아래 코드에서 age < 18 조건을 만족하면 IllegalArgumentException 을 발생시킨다. (미성년자 접근 제어)
- throw 를 활용하면 특정 상황에서 예외를 명확하게 정의하고 제어할 수 있다.
public class Main {
public static void main(String[] args) {
int age = 10;
if (age < 18)
// ✅ 의도적으로 예외를 발생시키는 부분
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
System.out.println("....");
}
}
2. 예외 전파
- 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때, 메서드를 호출한 상위 메서드로 전달되는 과정을 말한다.
- 예외가 프로그램 시작 지점(main()) 까지 전파되고 끝까지 처리되지 않으면 프로그램이 비정상 종료된다.
3. 예외 구조와 종류
RuntimeException - UncheckedException
- 컴파일러가 예외 처리를 강제하지 않는 예외
- RuntimeException 을 상속받는 모든 예외를 UncheckedException 이라고 한다.
- 예외 처리를 하지 않아도 컴파일 오류(빨간줄)가 발생하지 않는다.
- 처리되지 않은 예외는 계속 프로그램 시작 지점까지 전파된다.
- 끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료된다.
public class ExceptionPractice {
public void callUncheckedException() {
if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // ✅ 예외발생
}
}
}
// Main 클래스
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 언체크 예외 호출
exceptionPractice.callUncheckedException();
// ❌ 예외처리를 해주지 않았기 때문에 프로그램이 종료됩니다.
System.out.println("이 줄은 실행되지 않습니다.");
}
}
// try-catch 로 예외 처리
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
- 컴파일러가 예외 처리를 강제하는 예외
- Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 한다.
- 예외 처리를 하지 않으면 “컴파일 오류가 발생한다(코드에 빨간줄)”
- 반드시 try-catch로 예외를 처리하거나 throws 키워드를 사용해야 한다.
// try-catch 로 예외 처리
public class ExceptionPractice {
public void callCheckedException() {
try {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
} catch (Exception e) {
System.out.println("예외 처리");
}
}
}
// Main 클래스
public class Main {
public static void main(String[] args) {
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 체크예외 호출
exceptionPractice.callCheckedException();
}
}
// throws 키워드로, 예외를 상위로 전파
public class ExceptionPractice {
public void callCheckedException() throws Exception {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
}
}
// Main 클래스
public class Main {
public static void main(String[] args) {
ExceptionPractice exceptionPractice = new ExceptionPractice();
// try-catch 로 예외처리
try {
exceptionPractice.callCheckedException();
} catch (Exception e) {
System.out.println("예외처리");
}
}
}
4. 실습 과제
로그인 예외처리
- 사용자로부터 아이디와 비밀번호를 입력받습니다.
- 아이디가 “admin”, 비밀번호가 “1234” 가 아니면 로그인 실패 예외를 발생시킵니다.
- 로그인 실패 시 “로그인 실패! 아이디 또는 비밀번호가 잘못되었습니다.” 출력 후 다시 입력을 받습니다.
public class Login {
public static void LoginCheck(String id, String pw) throws Exception {
if (!id.equals("admin") || !pw.equals("1234")) {
throw new Exception("아이디 또는 비밀번호가 잘못되었습니다.\n");
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true) {
try{
System.out.print("아이디 입력: ");
String id = in.nextLine();
System.out.print("비밀번호 입력: ");
String pw = in.nextLine();
Login.LoginCheck(id, pw);
System.out.println("로그인 성공");
break;
} catch (Exception e) {
System.out.println("로그인 실패!");
System.out.println(e.getMessage());
}
}
}
}
'Java > 강의' 카테고리의 다른 글
[📙 Java 문법 종합반] 3-3. 컬렉션(Collection) (1) | 2025.04.16 |
---|---|
[📙 Java 문법 종합반] 3-2. Optional - null 을 다루는 법 (0) | 2025.04.16 |
[📙 Java 문법 종합반] 2-10. 객체지향 PART 4 - 다형성 (0) | 2025.04.15 |
[📙 Java 문법 종합반] 2-9. 객체지향 PART 3 - 추상화 (1) | 2025.04.15 |
[📙 Java 문법 종합반] 객체지향 PART 2 - 상속 (0) | 2025.04.15 |