throw 와 throws 는 뭐가 다를까요?
구분 | throw | throws |
의미 | 예외를 직접 발생시킴 | 예외가 발생할 수 있다고 선언 |
위치 | 메서드 내부 | 메서드 선언부 (괄호 뒤) |
역할 | 예외를 명시적으로 발생시킴 | 호출한 곳에 예외 처리를 넘김 |
함께 쓰는 대상 | 예외 객체 (new Exception) | 예외 클래스 이름 (Exception) |
간단하게 말하면?
✅ throw
➡ "예외를 직접 던질 때 사용하는 키워드!"
예: 특정 조건에서 강제로 예외를 발생시킬 때
throw new IllegalArgumentException("잘못된 입력입니다");
✅ throws
➡ "이 메서드는 예외를 던질 수도 있어~" 라고 알리는 키워드!
예: 호출한 쪽에서 예외 처리를 하라고 넘길 때
public void readFile() throws IOException {
// 파일 읽기 코드
}
둘 다 예외 처리를 위한 키워드지만,
- throw는 실제로 던지는 역할,
- throws는 던질 수도 있다고 선언하는 역할이에요!
👉 우리는 try-catch와 함께 이 키워드들을 사용해 예외 발생을 사전에 예방하고, 프로그램이 멈추지 않도록 도와줄 수 있습니다.
throw란?
예외를 "실제로 발생시키는" 키워드입니다.
➡ "지금 이 상황은 잘못된 상황이야! 강제로 예외를 발생시킬 거야!"
이때 개발자가 직접 특정 예외를 발생시키고 싶을 때 사용하는 것이 바로 throw입니다.
기본 문법
throw new 예외객체("에러 메시지");
예시
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다!");
}
➡ throw는 특정 조건에서 예외 객체를 직접 던지는 키워드예요.
이 코드는 "age가 0보다 작으면 문제가 있는 상황이야!" 라고 판단해서
IllegalArgumentException 예외를 강제로 발생시키는 것입니다.
✅ 즉, "지금 이건 잘못된 상황이야! 예외를 던져서 실행을 멈출게!" 라는 의미예요.
언제 사용하나요?
- 사용자의 입력값이 잘못되었을 때
- 특정 조건이 맞지 않아 더 이상 진행하면 안 될 때
- 직접 만든 사용자 정의 예외를 던질 때
사용 예시
💡 조건이 맞지 않으면 예외 던지기
public void withdraw(int amount) {
if (amount <= 0) {
throw new IllegalArgumentException("출금 금액은 0보다 커야 합니다.");
}
}
💡 사용자 정의 예외 던지기
if (!user.isLoggedIn()) {
throw new LoginRequiredException("로그인이 필요합니다.");
}
실습 예제
1️⃣ try-catch 없이 예외를 던진 경우
public class ThrowExample1 {
public static void main(String[] args) {
int age = -1;
if (age < 0) {
throw new IllegalArgumentException("나이는 0보다 작을 수 없습니다.");
}
System.out.println("정상 처리");
}
}
- 출력 결과 -
Exception in thread "main" java.lang.IllegalArgumentException: 나이는 0보다 작을 수 없습니다.
at ThrowExample1.main(ThrowExample1.java:6)
- throw로 예외를 던진 순간 프로그램이 중단됩니다.
- 아래 줄인 System.out.println("정상 처리");는 절대 실행되지 않습니다!
- 예외를 잡아주는 코드(try-catch)가 없기 때문이에요.
2️⃣ try-catch로 예외를 처리한 경우
public class ThrowExample2 {
public static void main(String[] args) {
int age = -1;
try {
if (age < 0) {
throw new IllegalArgumentException("나이는 0보다 작을 수 없습니다.");
}
System.out.println("정상 처리");
} catch (IllegalArgumentException e) {
System.out.println("예외 발생! 메시지: " + e.getMessage());
}
System.out.println("프로그램이 계속 실행됩니다.");
}
}
- 출력 결과 -
예외 발생! 메시지: 나이는 0보다 작을 수 없습니다.
프로그램이 계속 실행됩니다.
- 예외가 발생했지만 catch 블록이 예외를 받아 처리했기 때문에,
프로그램이 중단되지 않고 이후 코드까지 정상 실행됩니다. - 예외 메시지를 출력하면서 부드럽게 처리할 수 있어요!
💡 중단된다는 말은 "프로그램 전체가 멈춘다"는 의미가 아니라,
예외가 발생한 그 지점 이후의 코드는 실행되지 않는다는 뜻입니다!
주의 사항
throw는 항상 예외 객체와 함께 써야 합니다.
❌ 잘못된 예시 (예외 객체가 없어요!)
throw new Exception; // 컴파일 에러!
➡ 괄호가 없으면 객체를 만드는 게 아니기 때문에, 자바가 에러를 발생시킵니다.
✅ 올바른 예시 (예외 객체와 함께!)
throw new Exception("에러 메시지");
➡ 이렇게 "에러 메시지"를 담은 예외 객체를 생성해서 throw와 함께 써야 합니다.
✅ throw는 "이 예외를 던질게!"
근데 뭘 던질지 말 안 하면 자바가 알 수 없습니다.
그래서 항상 new Exception(...) 처럼 객체와 같이 써야 해요!
요약정리
- throw는 "지금 이 상황은 예외야!" 라고 예외를 실제로 발생시키는 키워드예요.
- 예외 객체를 직접 만들어서 던지기 때문에, 반드시 new 예외객체()와 함께 사용해야 합니다.
- 주로 입력값 검증, 조건 위반, 사용자 정의 예외 처리 등에 사용돼요.
throws란?
throws는 메서드 선언부에 사용되는 키워드로,
"이 메서드는 예외가 발생할 수도 있어요!" 라고 예외 가능성을 선언하는 키워드입니다.
➡ 예외가 발생할 수 있는 메서드에서
예외를 직접 처리하지 않고 호출한 쪽으로 넘기겠다는 의미예요.
기본 문법
리턴타입 메서드명() throws 예외타입 {
// 예외 발생 가능 코드
}
예시
public void readFile() throws IOException {
FileReader reader = new FileReader("test.txt");
}
➡ 이 메서드는 파일을 읽다가 IOException이 발생할 수 있으니
"나 대신 나를 호출한 사람이 이 예외를 처리해줘~" 라고 선언한 거예요.
언제 사용하나요?
- 메서드 내부에서 체크 예외(Checked Exception) 가 발생할 수 있을 때 (컴파일러가 강제하는 예외)
- 파일, DB, 네트워크처럼 예외가 반드시 발생할 수 있는 작업
- 예외를 try-catch로 처리하지 않고 "나 대신 호출한 애가 처리해줘~" 하고 넘길 때
사용 예시
1️⃣ 예외 발생 가능성을 호출자에게 알리기
public void processFile() throws IOException {
FileReader reader = new FileReader("data.txt");
}
2️⃣ 호출한 쪽에서 처리하기
public static void main(String[] args) {
try {
processFile();
} catch (IOException e) {
System.out.println("파일 처리 중 오류 발생: " + e.getMessage());
}
}
실습 예제
1️⃣ throws 없이 예외 발생 – 컴파일 에러!
import java.io.FileReader;
public class ThrowsExample1 {
public static void main(String[] args) {
FileReader reader = new FileReader("test.txt"); // ❌ 컴파일 에러!
}
}
- FileReader는 FileNotFoundException을 던질 수 있어요.
- 그런데 처리도 안 했고 throws도 안 써서 ❌ 컴파일 에러 발생!
2️⃣ throws로 예외 선언하기
import java.io.FileReader;
import java.io.IOException;
public class ThrowsExample2 {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("test.txt");
System.out.println("파일 열기 성공!");
}
}
✅ test.txt 파일이 존재하는 경우
파일 열기 성공!
❌ test.txt 파일이 존재하지 않는 경우
Exception in thread "main" java.io.FileNotFoundException: test.txt (지정된 파일을 찾을 수 없습니다)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
at chapter31.throwsExp.ThrowsExample2.main(ThrowsExample2.java:8)
- main 메서드에서 throws IOException을 선언했기 때문에
- 컴파일 에러 없이 실행 가능!
- 단, 예외가 발생하면 JVM이 처리하게 돼요.
3️⃣ 호출한 쪽에서 try-catch로 처리하기
import java.io.FileReader;
import java.io.IOException;
public class ThrowsExample3 {
public static void main(String[] args) {
try {
read();
} catch (IOException e) {
System.out.println("예외 발생: " + e.getMessage());
}
System.out.println("프로그램 계속 실행됩니다.");
}
public static void read() throws IOException {
FileReader reader = new FileReader("test.txt");
}
}
- 출력 결과 -
예외 발생: test.txt (지정된 파일을 찾을 수 없습니다)
프로그램 계속 실행됩니다.
- read() 메서드는 throws IOException으로 예외를 밖으로 던지고,
- main()에서 try-catch로 예외를 처리해서
👉 프로그램이 멈추지 않고 계속 실행됩니다!
주의 사항
1️⃣ throws는 예외가 발생할 수 있다는 "선언"일 뿐, 발생시키진 않아요!
2️⃣ 예외를 직접 발생시키려면 throw를 써야 합니다.
throw new IOException("파일이 없습니다!");
3️⃣ throws는 여러 개의 예외도 쉼표로 나열 가능합니다.
public void method() throws IOException, SQLException
요약 정리
- throws는 "이 메서드는 예외가 생길 수 있어요" 라고 컴파일러와 호출자에게 미리 알리는 거예요!
- 직접 예외를 발생시키진 않지만, 책임을 넘기는 역할을 합니다.
- 체크 예외가 발생할 수 있는 메서드에는 필수로 붙여야 해요!
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 37. List란? (ArrayList, LinkedList, Vector) (0) | 2025.04.22 |
---|---|
[Java] 36. 컬렉션 프레임워크란? (0) | 2025.04.22 |
[Java] 34. 사용자 정의 예외 만들기 (0) | 2025.04.21 |
[Java] 33. 예외(Exception) 처리 하기 (0) | 2025.04.21 |
[Java] 32. Error(오류) vs Exception(예외) (0) | 2025.04.21 |