JAVA/JAVA

Java | 예외 처리 throws & throw

pathas 2020. 2. 5. 17:45

throws

예외를 해당 메소드에서 처리하지 않고 미룬 후
메소드를 호출하여 사용하는 부분에서 예외를 처리하는 방법


형식

접근제어자 반환형 메소드명() throws 예외 처리 클래스명 {}

※ 복수의 예외 처리 클래스명 작성 가능


throw

사용자 정의 예외로 예외를 임의로 발생시켜서 프로그램을 테스트 할 수 있음

  • 이미 존재하는 예외의 경우 throw를 사용하여 바로 예외를 발생시킬 수 있음
  • 사용자 정의 예외의 경우 발생시키고자 하는 예외와 가장 유사한 예외 클래스를 상속
    잘 모르겠다면 가장 상위 클래스인 Exception 클래스 상속

형식_사용자 정의 예외 클래스

class 사용자 정의 예외 클래스명 extends 예외 클래스명{
    // 생성자
    사용자 정의 예외 클래스명(String msg){
        super(msg);
    }
}

※ String msg: 에러 메세지를 인자로 받는 매개변수
상위 예외 클래스 생성자를 호출하고 예외 메세지를 인자로 전달받아서 예외 객체 생성


형식_예외 발생

throw new 예외 처리 클래스명("예외 메세지");

예제_throws & throw

package j200205;

import java.util.Scanner;

// 사용자 정의 예외, Exception 클래스 상속
class OverLength extends Exception {

    // 생성자, 예외 메세지를 인자로 전달받아서 예외 객체 생성
    OverLength(String message) {
        super(message);
    }
}

public class PrintString {

    // Overlength 예외를 메소드 호출시 처리하도록 미룸
    static void print() throws OverLength {
        // 스캐너 객체 생성
        Scanner sc = new Scanner(System.in);

        // 문자열 입력
        System.out.println("문자열을 입력해주세요.");
        String str = sc.nextLine();

        // 문자열의 길이가 5자 이상일 때 예외 발생
        if (str.length() >= 5)
            throw new OverLength("문자열은 5자 이상 입력할 수 없습니다.");
    }

    public static void main(String[] args) {
        // 예외 처리
        try {
            PrintString et = new PrintString();
            print();
            
        // 예외 발생시 예외 정보 출력
        } catch (Exception e) {
            System.out.println(e);
        }
        
        /*
        문자열을 입력해주세요.
        안녕하세요??
        j200205.OverLength: 문자열은 5자 이상 입력할 수 없습니다.
        */
    }

}

예외 처리를 메소드 호출로 미루는 throws 예약어와 임의의 예외를 발생시키는 throw 예약어에 대해 알아보았습니다.

두 예약어가 굉장히 비슷하기 때문에 헷갈리지 않도록 해야 하겠습니다.

throws는 그렇게 권장되는 방법은 아니며 주로 try~catch문으로 예외를 처리한다고 합니다.

또한 throw 예약어를 사용하면 예외를 테스트해 볼 수 있기 때문에 발생 가능한 예외를 사전에 점검해 볼 수 있고,

프로그램이 원하지 않는 방향으로 흘러가는 경우에 임의로 예외를 발생시키도록 할 수도 있겠습니다.