예외란 ?
프로그램 실행 중 예상하지 못한 상황이 빌생하는 것을 의미함.
의도적으로 예외를 발생시킬 땐 throw키워드를 통해 발생시킴.
※예외를 처리하지 않으면 프로그램이 중단될 수도. -> 그래서 예외처리(try-catch)를 통해 프로그램을 실행.
의도적인 예외란 ? 특정도전에서 의도적으로 예외를 발생시킬 수 있음.
ex) 나이가 18살 이하일 경우 예외발생
public class Main {
public static void main(String[] args) {
int age = 10;
if (age < 18) {
// ✅ 의도적으로 예외를 발생시키는 부분
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
System.out.println("....");
}
}
throw를 통해 특정상황(age<18)에서 예외를 정의하고 제어할 수 있음 이렇게 예외가 발생하면 예외 밑에
" System.out.println("...."); " 출력 부분은 실행되지 않음.
그러면 이 예외를 고쳐줘야 하는데 (예외구조와 종류)
- RuntimeException - UncheckedException : RuntimeException을 상속받는 모든 예외를 UncheckedException라고 한다. 예외처리를 컴파일러가 체크 해주지않음(unchecked)
- Exception - CheckedException : Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 한다. 예외처리를 컴파일러가 체크 해줌.(checked)

예외전파
- 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때 매서드를 호출한 상위 메서드로 전달되는 과정.
- 예외가 프로그램 시작 지점(main)까지 전파되고 끝내 처리되지 않으면 프로그램이 비정상 종료됨.
RuntimeException = UncheckedException 처리방법
public class ExceptionPractice {
public void callUncheckedException() {
if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // ✅ 예외발생
} // 무조건 예외가 발생하는 로직 이대로 두면 이 메서드( callUncheckedException())를 호출한 다른 클래스에도 영향을 미침
}
}
메서드 클래스 내에서 처리한다면 ↓
public class ExceptionPractice {
public void callUncheckedException() {
try{ if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // ✅ 예외발생
} catch( RuntimeException e) {
System.out.println("언체크 예외 처리");
}
}
}
메서드를 호출한 클래스에서 처리하기 ↓
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("체크 예외 처리");
} //catch는 여러개 넣을 수 있음
System.out.println("프로그램 종료");
}
}
try안에 예외가 발생할 수 있는 로직을 넣어주고
catch안에 처리하고싶은 에러를 매개변수로 넣고 출력.
cathc는 여러개 나올 수 있음.
Exception = checkedException
메서드를 작성한 클래스 안에서 처리방법 ↓
public class ExceptionPractice {
public void callCheckedException() {
// ✅ try-catch 로 예외 처리
try {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
} catch (Exception e) {
System.out.println("예외 처리");
}
}
}
하지만 클래스 내에서가 아니라 호출한 클래스에서 예외를 처리하고 싶을때 ?
checkedException 오류는 컴파일에서 오류를 확인하기 때문에 다음으로 넘어갈 수가 없음 그럴 때 쓰는게
throws
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("예외처리");
}
}
}
'BACK-END > JAVA' 카테고리의 다른 글
| JAVA | 20251118 연산자 (0) | 2025.11.19 |
|---|---|
| JAVA | 20251117 (0) | 2025.11.17 |
| [자바] 계산기 과제 TIL (0) | 2025.04.23 |
| [자바 프로그래밍 기초] scanner 메소드 next(), nextLine() (0) | 2025.04.16 |
| 1. Java란 ? (0) | 2025.03.27 |