[Java] 메서드에 예외 선언하기

nathan·2022년 1월 26일
0

JAVA

목록 보기
35/45

메서드에 예외 선언하기

  • 예외를 처리하는 방법 :
    • try-catch문(직접 처리)
    • 예외 선언하기(= 예외 떠넘기기, 알리기)
    • 은폐(덮기 = 빈 catch 블럭)
  • 메서드가 호출시 발생 가능한 예외를 호출하는 쪽에 알리는 것
    • (예외를 발생시키는 키워드 throw와 예외를 메서드에 선언할 때 쓰이는 throws를 잘 구별하자!)
void method() throws Exception1, Exception2, ..., ExceptionN {
   // 메서드의 내용
}

// method()에서 Exception과 그 자손 예외 발생 가능
void method() throws Exception {
   // 메서드의 내용
}

여기서 잠깐!

오버라이딩의 조건 3가지

  • 1) 선언부 일치
  • 2) 접근 제어자를 조상보다 좁게 설정 불가
  • 3) 조상보다 많은 예외 선언 불가

따라서 오버라이딩 후 예외 선언시 조상보다 많은 예외를 선언하지 않도록 주의해야 한다!

예시 코드 1

static void startInstall() throws SpaceException, MemoryException {
   if (!enoughSpace())
      throw new SpaceException("설치할 공간이 부족합니다");
   if (!enoughMemory())
      throw new MemoryException("메모리가 부족합니다");
}

예시 코드 2

public class Ex8_6 {
    public static void main(String[] args) throws Exception { // main 메서드가 죽으면, JVM에 예외가 넘어가게 된다.
        method1();
    }

    static void method1() throws Exception{
        method2();
    }

    static void method2() throws Exception{
        throw new Exception();
    }
}

>>> JVM 기본 예외 처리기가 출력한 내용
Exception in thread "main" java.lang.Exception
	at Ex8_6.method2(Ex8_6.java:11)
	at Ex8_6.method1(Ex8_6.java:7)
	at Ex8_6.main(Ex8_6.java:3)

예시 코드 3

import java.io.File;

public class Ex8_10 {
    public static void main(String[] args) {
        try {
            File f = createFile("test.txt");
            // File f = createFile("");            
            System.out.println(f.getName()+"파일이 성공적으로 생성되었습니다.");
        } catch (Exception e){
            System.out.println(e.getMessage()+" 다시 입력해 주시기 바랍니다.");
        }
    }

    static File createFile(String fileName) throws Exception {
        if (fileName == null || fileName.equals("")){
            throw new Exception("파일 이름이 유효하지 않습니다.");
        }
        File f = new File(fileName);
        return f;
    }
}
>>>
test.txt파일이 성공적으로 생성되었습니다.
파일 이름이 유효하지 않습니다. 다시 입력해 주시기 바랍니다.

finally 블럭

  • 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.
try{
   // 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception e1) {
   // 예외처리를 위한 문장을 적는다.
} finally {
   // 예외의 발생여부에 관계없이 항상 수행되어야 하는 문장들을 넣는다.
   // finally 블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}

참고로, try 블럭 안에 return 문이 있어서 try 블럭을 벗어나갈 때에도 finally 블럭은 실행된다.

profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글