예외클래스 정의


프로그램의 논리에 어긋나지만 문법적으로 문제가 되지않는 상황은 가상머신이 인식할수있는 예외상황이아니다.

이러한 유형의 예외상황은 예외상황의 발생을 프로그래머가 정의해야 한다.


예외클래스 정의의 조건


Exception 클래스 상속

Exception 클래스는 모든 예외 클래스가 상속하는 Throwable 클래스의 하위 클래스이다.

이를 상속함으로 예외 클래스가 되어서 try~catch 예외처리 매커니즘에 활용이 가능한 클래스가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package java01;
 
import java.util.Scanner;
 
class AgeInputException extends Exception{
    public AgeInputException(){
        super("유효하지 않은 나이가 입력되었습니다.");
    }
}
class ProgrammerDefineException{
    public static void main(String[] args){
        System.out.println("나이를 입력하세요");
        try{
            int age = readAge();
            System.out.println("당신은"+age+"세입니다.");
        }catch(AgeInputException e){
            System.out.println(e.getMessage());
        }
    }
 
    public static int readAge() throws AgeInputException{
        Scanner sc = new Scanner(System.in);
        int age = sc.nextInt();
        if(age<0){
            AgeInputException excpt = new AgeInputException();
            throw excpt;
        }return age;
    }
}
 
 
/* 실행결과 
    나이를 입력하세요 : -2
    유효하지 않은 나이가 입력되었습니다.
*/
cs


실행결과를 통해 알수있는 사실

Exception 클래스의 생성자 호출을 통해서 전달된 문자열이 getMessage 의 호출을 통해서 반환된다.

예외클래스를 정의할 때 해당 예외의 상황설명에 필요한 문자열을 Exception 클래스의 생성자에 전달하면 된다.


throw 문의표현방식

예외상황이 발생했음을 알리는 문장 throw excpt;

throw 문이 존재하는 위치가 예외상황이 발생했음을 알리는 지점이 된다. 따라서 이 부분을 

try~catch 문으로 감싸서 예외상황을 처리 할수도 있는데 이러한 경우 예외의 처리는 throw 문이 존재하는 main 메소드의 

readAge 메소드 호출문장을 try~catch 문으로 감싸는 것이다.따라서 예외상황을 알리기 위해 생성된

AgeInputException 인스턴스의 참조 값은 main 메소드에 존재하는 catch 영역으로 전달되어 예외상황이 처리된다.


throws 문

예외상황이 메소드 내에서 처리되지 않으면 메소드를 호출한 영역으로 예외의 처리가 넘어감(던져짐)을 반드시 명시해야 한다.

throw에 의해 생성된 예외상황은 반드시 try~catch 문에 의해 처리되거나 throws 에 의해서 넘겨져야 한다.


readAge 메소드의 정의를 보면 throws AgeInputException 선언이 존재한다.

이는 "readAge 메소드 내에서 AgeInputExcpetion 에 대한 예외상황을 처리하지 않으니 이 메소드를 호출하는 영역에서는

AgeInputException 에 대한 처리도 대비해야 한다."는 선언이다.

이렇듯 throw에 의해 생성된 예외상황이 메소드 내에서 처리되지 않는다면 메소드를 호출한 영역으로 넘어감을 반드시 명시해야 한다.


가상머신의 예외처리

throws 문에 의해 던져진 예외상황은 메서드를 호출하는곳으로 넘겨진다. 예외상황이 main메소드를 호출한 영역까지 넘어가게 되면

main메소드는 자바 가상머신이 호출하는 메소드이기 때문에 예외처리는 가상머신이 하게된다.

가상머신의 처리방식은 1.getMessage 메서드 호출 2.예외상황 발생해서 전달되는 과정 출력 3.프로그램종료

더이상의 실행으로 이어지지 않고 프로그램이 종료된다.


printStackTrace

예외가 발생해서 전달되는 과정의 출력은 프로그램에 존재하는 오류를 파악하는데 매우 도움이 된다.

이러한 유형의 메세지를 출력하는방법은 Throwable 클래스에 정의되어있는 

printStackTrace 메소드가 이러한 유형의 메세지를 출력한다.


1
2
3
4
5
try{
    ...        
}catch(Exception e){
    e.printStackTrace();
}
cs




'Java' 카테고리의 다른 글

Object 클래스의 메서드 toString / equals  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25
인터페이스 interface  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25

+ Recent posts