티스토리 뷰

예외 처리 방법 종류 ⭐️

  1. try-catch문(직접 처리)
  2. 예외 선언하기(예외 떠넘기기, 알리기)
  3. 은폐, 덮기(빈 catch블럭)

 

더보기

예외 선언하기는 예외 처리와 다르다. 예외를 자기가 처리하는 게 아니라, 자기를 호출한 사람한테 예외 처리를 떠넘기는 것이다.

 상사가 나에게 일을 시켰는데, 문제가 발생했다면 직접 처리(try-catch문)할 수 있다. 아니면 그 문제를 일을 시킨 상사에게 보고할 수도 있다. 그것을 '예외 선언'이라 한다.

메서드에 예외 선언하기 ⭐️

  • 메서드가, 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것

 

더보기

| 참고 | 예외를 발생시키는 키워드 throw와 예외를 메서드에 선언할 때 쓰이는 throws를 잘 구별하자.

[java API] wait 메서드 사용 시 IllegalMonitorStateException과 InterruptedException 예외가 발생할 수 있다.

따라서 IllegalMonitorStateException와 InterruptedException 두 가지 예외처리를 해주어야 한다.

하지만,  IllegalMonitorStateException을 제외하고 InterruptedException 예외 선언만 되어 있다. 발생할 수 있는 예외는 두 개인데 왜 한 개만 선언했을까? 그 이유는 다음과 같다.

InterruptedException은 Exception클래스의 자손이기 때문에 check예외이다. 따라서 예외 처리가 필수이다.
하지만 IllegalMonitorStateException은 RuntimeException의 자손이기 때문에 unchecked예외, 예외 처리가 선택이다.

따라서, InterruptedEception만 선언해주면 된다. 필수처리예외(checked예외)만 선언하면 된다. 선택이기 때문에 둘 다 적어도 괜찮지만, 체크드 예외만 적어주는 게 정석이다.

예제 8-9

Ex8_9 실습하기

 

더보기

 

main메서드에서도 '예외 처리'를 하지 못하면 JVM의 기본 예외처리기가 출력한다.

예제 8-10

Ex8_10 실습하기

 

더보기

실습 1.

package ch08;

import java.io.*;

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

    static File createFile(String fileName) throws Exception {
        try {
            if (fileName==null || fileName.equals(""))
                throw new Exception("파일이름이 유효하지 않습니다.");
        } catch (Exception e) {
            fileName = "제목없음.txt";
        }

        File f = new File(fileName); // File클래스의 객체를 만든다.
        // File클래스의 createNewFile메서드를 이용해서 실제 파일을 생성한다.
        f.createNewFile();
        return f;
    }   // createFile메서드의 끝
}  // 클래스의 끝

실습 2. 

package ch08;

import java.io.*;

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

    static File createFile(String fileName) { // throws Exception {
        try {
            if (fileName==null || fileName.equals(""))
                throw new Exception("파일이름이 유효하지 않습니다.");
        } catch (Exception e) {
            fileName = "제목없음.txt";
        }

        File f = new File(fileName); // File클래스의 객체를 만든다.
        // File클래스의 createNewFile메서드를 이용해서 실제 파일을 생성한다.
        try {
            f.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return f;
    }   // createFile메서드의 끝
}  // 클래스의 끝

finally 블럭

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

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

 

더보기
임시 파일 삭제 코드를 finally블럭에서 처리하게 하므로써 '코드중복제거'
댓글
공지사항