[자바] throw & throws

라미·2024년 2월 20일

Java

목록 보기
2/3
post-thumbnail

예외 발생시키기

예외 발생시키기 (throw)

throw : 명시적으로 예외를 발생시킬 때 사용하는 키워드

  • 예외를 강제로 발생시킨 후, 상위 블럭이나 catch 문으로 예외를 던진다!!!!!

📝예제

public static void main(String[] args) {
    try {
        Exception e = new Exception("고의로 예외 발생"); // 예외 클래스 객체 생성
        throw e; // 예외 발생 -> throw new Exception("고의로 예외 발생"); 로 줄여 쓸 수 있음
    } catch(Exception e) {
        System.out.println("예외메시지 : " + e.getMessage());
        e.printStackTrace();
    }
}

💻출력 결과

예외메시지 : 고의로 예외 발생
java.lang.Exception: 고의로 예외 발생
	at week04.sample01.Sample.main(Sample.java:6)

메서드에 예외 선언하기(예외 떠넘기기/알리기)

예외 선언하기(throws)

throws : 메서드 호출시 발생가능한 예외를 호출하는 쪽에서 처리하도록 한다

  • 선언법 : void method() throws Exception1, Exception2,....,ExceptionN { // 메서드내용 }

📝예시

public static void thisMethodIsDangerous() throws Exception {
    throw new Exception("메소드에서 예외 던짐");
}
public static void main(String[] args) {
    try {
        thisMethodIsDangerous();
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}
  1. thisMethodIsDangerous() 메서드에 예외를 선언
  2. main() 메서드에서 thisMethodIsDangerous() 호출시 예외 처리에 대한 경고 알려줌
  3. main() 메서드에서 try-cath 로 예외처리 진행

사용자 정의 예외 만들기

사용자가 집적 예외 클래스를 정의
Exception과 RuntimeException 중에서 선택하여 상속받는다.
문자열을 매개변수로 받는 생성자 있어야 한다.

📝정의

//사용자 정의 예외 클래스 정의
class MyException extends Exception{
    MyException(String msg){ // 문자열을 매개변수로 받는 생성자
        super(msg); // 부모인 Exception 클래스의 생성자를 호출
    }
}

예외 되 던지기(exception re-throwing)

예외를 처리한 후 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것

📝예제

static void myException() throws Exception { //예외 선언
    try {
        throw new Exception("예외 던지기");
    } catch (Exception e) {
        System.out.println("메소드에서 예외 처리하기");
        throw e; // 예외 다시 던지기(예외 다시 발생)
    }
}
public static void main(String[] args) {
    try {
        myException();
    } catch (Exception e) {
        System.out.println("main에서 다시 예외 처리하기");
    }
}

💻출력 결과

메소드에서 예외 처리하기
main에서 다시 예외 처리하기

myException()
1. throw new Exception("예외 던지기"); 예외 발생
2. 메소드 catch 블럭에서 예외 처리
3. throw e; 다시 예외 발생 → 호출한 쪽으로 예외 넘기기
main()
4. catch 블럭에서 다시 예외 처리


연결된 예외(chained exception)

한 예외가 다른 예외를 발생시킬 수 있다.(예외 A가 예외 B를 발생시키면 A는 B의 원인 예외)
사용하는 이유

  • 여러 예외를 하나로 묶어서 다루기 위해
  • checked예외를 unchecked예외를 변경하려 할 때

Throwable initCause(Throwable cause) : 지정한 예외를 원인 예외로 등록
Throwable getCause() : 원인 예외를 반환

📝예제

public class Throwable implements Serializable {
    private Throwable cause = this; // 객체 자기자신을 원인 예외로 등록
    public synchronized Throwable initCause(Throwable cause){
        this.cause = cause; // cause를 원인 예외로 등록
        return this;
    }
}

void install() throws InstallException{
    try{
        starInstall(); // SpaceException 발생(저장공간이 부족해서)
        copyFiles();
    }catch(SpaceException e){
    InstallException ie = new InstallException("설치중 예외발생"); //예외 생성
    ie.initCase(e); //InstallException의 원인 예외를 SpaceException으로 지정
    throw ie; //InstallException을 발생
    }    
}

프로그램 설치를 하는 install() 이라는 메서드라고 할때
1. startInstall() 에서 SpaceException이 발생 -> catch 블록이 처리
2. catch 블록(SpaceException e) -> 새로운 예외 B를 생성(InstallException)
3. ie.initCase(e); -> SpaceException 을 InstallException의 원인 예외로 등록해줬다
4. throw ie; -> InstallException을 발생
SpaceException - InstallException : 연결된 예외!

0개의 댓글