Java - throw 와 throws

c.Hano·2024년 11월 22일

자바

목록 보기
7/17

throw


문법.

throw new 예외객체("입력하고싶은 메시지");

//메서드 내부에서 선언이 가능하다.

문제(오류)를 실제로 던지는 행위

오류를 직접 발생시킨다고 보자.

  • 반드시 예외 객체를 생성해서 던져야 한다.
  • 예외 객체는 Exception 이나 그 하위 클래스의 인스턴스여야 한다.
    - 예외 객체 : 대부분 Exception 이나 RuntimeException을 상속받는다.
    지금은 그냥 예외를 담아 둘 수 있는 클래스가 있다 정도로만 알아두자.. (나중에 또 만나것지..)
    	- 자바에서 제공한 예외 클래스가 아닌 사용자 정의 예외 클래스를 통해 throw를 이용 할 수 있다. 그건 밑에서 보자.

throws

문법.

public 리턴타입 메서드명(매개변수) throws 예외클래스1, 예외클래스2 {
    // 메서드 본문
}
//하나 이상의 예외 클래스를 선언할 수 있다.
//메서드 옆에 선언한다.

문제(오류)가 발생 할 수 있다고 선언하는 것.

해당 메서드에 오류가 발생 할 수 있다고 선언한다.

예제를 통해 좀 더 알아보자.


import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            readFile();
        } catch (IOException e) {
        //IOException 이 뭐임? -> 지금은 Exception 의 하위 클래스 정도로만 알아두자.
            System.out.println("파일 읽기 중 예외 발생: " + e.getMessage());
        }
    }

    public static void readFile() throws IOException {
    //readFile() static 메서드를 작성하였다.
    //redaFile() 메서드 내부에서 오류가 발생할 수 있다.
    //오류가 발생한다면 오류를 IOException 클래스로 throws 할 것이다.
        throw new IOException("파일을 찾을 수 없습니다.");
        // throw new IOException을 통해 오류를 직접 발생시켰다.
        // 오류가 발생하면 "파일을 찾을 수 없습니다"라고 출력이 될 것이다.
    }
}

예외 객체는 반드시 예외 클래스의 인스턴스여야 한다.
자바에서 예외는 Throwable 이라는 클래스와 그 하위 클래스에서 파생 된 객체로만 처리가 가능하다. 반드시 "Throwable"을 상속받은 클래스여야 한다. 이를 벗어나면 컴파일 에러가 발생한다.

Throwable 클래스 구조

Throwable 클래스는 자바에서 예외와 에러를 나타내는 최상위 클래스이다.
throw는 Throwable 클래스의 하위 클래스의 객체만 던질 수 있다.

java.lang.Object 
	↳ java.lang.Throwable 
		↳ java.lang.Exception 
			↳ 사용자 정의 예외 (Custom Exceptions) 
		↳ java.lang.Error

대충 이런 구조라고 생각하자.

throw new 예외객체 (""); 에서 예외객체 부분에서 Throwable의 하위 클래스가 아닌 다른 객체 (String, int)를 작성하면 컴파일 오류가 생긴다.
(Exception이나 그 하위 클래스를 extends한 사용자 정의 객체는 예외이다.)

사용자 정의 예외를 던져보기
class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

Exception 클래스를 상속하는 MyCustomException 이라는 클래스를 직접 만들었다.

해당 메서드는 외부에서 message를 입력 받고 받은 message 값을 Exception으로 내보내준다.

public class Main {
    public static void main(String[] args) {
        try {
            validateNumber(-1);
        } catch (MyCustomException e) {
            System.out.println("예외 처리: " + e.getMessage());
            //MyCustomException 내부에는 getMessage()라는 메서드가 없다.
            //부모의 클래스에서 getMessage()를 찾아본다.
            //부모의 클래스에서 getMessage()를 찾았다.
            //MuCustomException 에서 받은 message를 super(message)로 올렸으니 올린 값이 출력 된다.
        }
    }

    public static void validateNumber(int number) throws MyCustomException {
        if (number < 0) {
            throw new MyCustomException("양수를 입력해야 합니다: " + number);
            //사용자 지정 예외 클래스를 불러와서 예외를 일으켰다.
        }
    }
}
결과값.

예외 처리: 양수를 입력해야 합니다: -1

정리.

  • throw 뒤에는 반드시 Throwable 클래스 또는 그 하위 클래스의 객체를 작성해야 한다.
  • 던질 수 있는 예외 객체들.
  • 표준 예외(Exception, RuntimeException 등)
  • 사용자 정의 예외 객체들.
  • 시스템 에러(Error). <- 이 부분은 나중에 다루자.
  • 던질 수 없는 객체
  • String, Integer 등 Throwable을 상속받지 않는 클래스의 객체.
  • 예외 객체 생성시 throw new Exception ("쓰고싶은말") 을 함께 전달하면, .getMessage()로 확인이 가능하다.
profile
꼬질이

0개의 댓글