프로그램 실행중 예상하지 못한 상황
10/0 같은 경우, (내가 해당 예외를 예측하지 않았다는 가정하에)throw 를 사용한 경우미성년자의 접근등 비즈니스 규칙에 대한 예외상황을 정의해두고 제어하는 것 !throw new IllegalArgumentException 사용하기public class Main {
public static void main(String[] args) {
int age = 10;
if (age < 18) {
// ✅ 의도적으로 예외를 발생시키는 부분
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
System.out.println("....");
}
}

💡 예외의 전파
상위 메서드로 계속 퍼져서 프로그램 시작지점 메인까지 도달하게된다!
끝내 처리만 되면 프로그램은 종료되지 않을 것. (메인에서 처리해도 된다는 말)
RuntimeException 을 상속받는 모든 예외는 UncheckedException 이다![]()
1️⃣
RuntimeException()으로ExceptionPractice를 예외 상황으로 가정.![]()
2️⃣ 처리하지 않는 경우 - 언체크 예외가 호출되고 나면 예외가 발생하고, 실행되지 않는다
![]()
3️⃣ 예외 처리 - 이 예시에서는 main에서
try-catch로 모든 예외를 처리해주고 있다
- 예외는 전파되기에 메인에서 잡아줘도 된다!
- try문 안에서 if문을 사용하고,
throw new RuntimeException();을 통해 특정 조건에서 예외를 발생시킬 수 있다
Exception 클래스를 직접 상속받는 모든 예외는 CheckedException이다RuntimeException을 상속받는 예외 제외 )try-catch를 사용한다throws로 다른 클래스에 책임을 전가 후에 처리한다![]()
1️⃣
Exception()으로callCheckedException를 예외 상황으로 가정.
아직 처리되기 전이므로 컴파일 오류(빨간줄) 발생 !![]()
![]()
2️⃣ 예외 처리 - 이번에는 예외 객체를 생성후에 처리했다!
throw ➡ 예외를 "직접" 발생시키는 키워드✔ 개발자가 특정한 조건에서 예외를 발생시킬 때 사용
✔ throw new 예외클래스명("예외 메시지") 형태로 사용
📌 예제 (throw로 직접 예외 발생)
public class Example {
public static void main(String[] args) {
int age = 10;
if (age < 18) {
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!"); // 예외 발생
}
System.out.println("정상 실행됨");
}
}
✔ throw는 즉시 예외를 발생시키고 프로그램을 중단시킴
✔ 특정한 조건에서 "잘못된 입력이 들어왔다!" 하고 예외를 던지는 역할
throws ➡ 메서드에서 "예외를 던질 수 있다"고 선언✔ 메서드가 예외를 직접 처리하지 않고, 호출한 곳에서 처리하도록 예외를 넘기는 역할
✔ throws 예외클래스명 형태로 메서드 선언부에 사용
📌 예제 (throws를 사용해 예외를 호출한 곳에서 처리)
public class Example {
// 메서드에서 예외를 던질 수 있다고 선언
public static void checkAge(int age) throws IllegalArgumentException {
if (age < 18) {
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
}
public static void main(String[] args) {
try {
checkAge(10); // 메서드 호출 → 예외 발생 가능
} catch (IllegalArgumentException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
✔ throws는 메서드가 예외를 직접 처리하지 않고, 예외를 던질 수 있다고 알리는 것
✔ 호출한 main() 메서드에서 try-catch로 예외를 처리
throw와 throws 같이 쓰는 예제throws로 예외를 넘기고, throw로 예외를 발생시키는 코드
public class Example {
// throws로 예외를 넘길 수 있다고 선언
public static void checkNumber(int num) throws IllegalArgumentException {
if (num < 0) {
throw new IllegalArgumentException("음수는 허용되지 않습니다!"); // throw로 예외 발생
}
System.out.println("정상적인 숫자입니다: " + num);
}
public static void main(String[] args) {
try {
checkNumber(-5); // 메서드 호출 → 예외 발생 가능
} catch (IllegalArgumentException e) {
System.out.println("예외 처리: " + e.getMessage());
}
}
}
✔ throw는 IllegalArgumentException을 실제 발생시키는 역할
✔ throws는 checkNumber(int num) 메서드가 예외를 던질 수 있다는 걸 선언하는 역할
throw 🆚 throws 비교 요약| 구분 | throw | throws |
|---|---|---|
| 역할 | 예외를 "직접" 발생시킴 | 메서드에서 예외를 "던질 수 있음"을 선언 |
| 사용 위치 | 메서드 내부에서 사용 | 메서드 선언부에서 사용 |
| 사용 방식 | throw new 예외클래스명("메시지"); | 메서드명() throws 예외클래스명 |
| 처리 방식 | 예외를 즉시 발생시키고 프로그램 중단 | 호출한 곳에서 예외를 처리해야 함 |
throw throws null을 안전하게 다루게 해주는 객체이다! ➝ 관련 예외인 *NullPointerException 을 방지Optional 객체는 값이 있을 수도 있고 없을 수도 있는 컨테이너다!💡
NullPointerException(언체크드 예외)
- 단순 값이 없을 때보다도, 없는 객체의 메서드를 사용할 때 발생!
- 컴파일러가 확인해주지 않기 때문에 미리 예외 처리 해둬야함
->if문을 활용해 논리적으로 예외를 잡을 수도 있지만,,! 하나씩 언제 다해?????
ofnullable로 null이 담길 가능성이 있는 데이터를 감싸서 메서드에 넣자!🌟
이 메서드를 사용하게 되면 Optional 객체가 생성되므로, "어쩌면 null 값이 있을 수도 있겠다!"
➝ 가독성 높아짐
Optional이 비었는지 아닌지 알 수 있다!
True = 안 비었음 , False = 비어있음
💡 Optional 사용 예시
student가 null이 아닌 경우 안전하게 가져오고, 게터 사용student가 null인 경우 메세지 출력public class Main { public static void main(String[] args) { Camp camp = new Camp(); // Optional 객체 반환받음 Optional<Student> studentOptional = camp.getStudent();✅ // Optional 객체의 기능 활용 boolean flag = studentOptional.isPresent(); // ✅false 반환 if (flag) { // 존재할 경우 Student student = studentOptional.get(); // ✅ 안전하게 Student 객체 가져오기 String studentName = student.getName(); System.out.println("studentName = " + studentName); } else { // null 일 경우 System.out.println("학생이 없습니다."); } } }