throw 키워드는 메서드 내에서 사용되며, 개발자가 직접 예외를 발생시키고자 할 때 사용된다. 즉, 특정 조건에서 예외를 강제로 발생시키기 위해 사용된다.
throw는 단일 객체를 인자로 받으며, 이 예외 객체는 new 키워드를 사용하여 생성된다.
예외가 throw되면, 이후의 코드는 실행되지 않고, 즉시 현재 메서드를 종료하며, 해당 예외를 메서드 호출 스택으로 전파한다.
public void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("Access denied - You must be at least 18 years old.");
} else {
System.out.println("Access granted - You are old enough!");
}
}
package javaplus.exception;
public class ThrowEx {
public static void main(String[] args) {
ThrowEx ex = new ThrowEx();
ex.throwException(11);
}
public void throwException(int number){
try{
if(number>10){
throw new Exception("숫자가 10보다 큽니다.");
}
System.out.println("입력 숫자: " + number);
}catch(Exception e){
e.printStackTrace();
}
}
}
만약, 해당하는 예외가 없다면, 예외가 발생한 메서드를 호출한 메서드로 던지는데, 이 때 사용하는 것이 throws다.
throws 키워드는 메서드 선언부에서 사용되며, 해당 메서드가 실행 도중 발생할 수 있는 예외를 명시적으로 선언하는 데 사용된다.
이는 메서드를 사용하는 측에게 해당 메서드를 호출할 때 처리해야 할 예외가 있음을 알린다.
throws는 하나 이상의 예외 타입을 지정할 수 있으며, 에외 타입은 콤마로 구분한다.
// implements 처럼 ','로 구분해서 예외 클래스 이름을 적어주면 된다.
public void readFile(String fileName) throws FileNotFoundException {
File file = new File(fileName);
FileInputStream stream = new FileInputStream(file);
// 파일 처리 로직...
}
public void throwsException(int number) throws Exception{
if(number> 10){
throw new Exception("숫자가 10보다 큽니다.");
}
System.out.println("입력 숫자: " + number);
}
이렇게 메서드를 선언하면, 호출한 메서드로 예외 처리를 위임한 것이기 때문에, 문제가 되지 않는다. 하지만 이럴 경우 Exception은 처리되지 않고 프로그램이 비정상 종료될 수 있다. 따라서, main 메서드에서 try-catch블록으로 예외를 감싸줘야 한다. 수정 코드는 아래와 같다.
package javaplus.exception;
public class ThrowsEx {
public static void main(String[] args) {
ThrowsEx ex = new ThrowsEx();
try {
ex.throwsException(11);
} catch (Exception e) {
System.err.println("예외 발생: " + e.getMessage());
e.printStackTrace();
}
}
public void throwsException(int number) throws Exception {
if (number > 10) {
throw new Exception("숫자가 10보다 큽니다.");
}
System.out.println("입력 숫자: " + number);
}
}
throwsException 메서드 호출을 try 블록 내에 포함시키고, catch 블록에서 Exception 처리한다. 이렇게 하면 예외가 발생해도 프로그램이 안전하게 종료될 수 있다.