본문 바로가기

Java

14 - 4장 사용자 정의 예외 클래스

1. 사용자 정의 예외 클래스 생성 방법

 

 1) 사용자 정의 예외 클래스 작성

 

  - Exception을  상속해 일반 예외 클래스로 만드는 방법

class MyException extends Exception {
	MyException() {
    }
    MyException(String s) {
    	super(s); //부모 생성자 호출
    }
}

 - RuntimeException을 상속해 실행 예외 클래스로 만드는 방법

class MYRTException extends RuntimeException {
	MyRTException() {
    }
    MyRTException(String s) {
    	super(s); //부모 생성자 호출
    }
}

- 기본 생성자

- 문자열을 입력받는 생성자 

  -> 예외 메시지를 전달받아 예외 객체를 생성하는 생성자

  -> 내부에서는 부모 클래스인 Exception 또는 RuntimeException 클래스의 생성자를 호출해 사용

 

2) 사용자 정의 예외 객체 생성

 

- 예외 클래스로 예외 객체 생성

MyException me1 = new MyException();
MyException me2 = new MyException("예외 메시지");
MyRTException mre1 = new MyRTException();
MyRTException mre2 = new MyRTException("예외 메시지");

 

3) 예외 상황에서 예외 객체 던지기 

 

 - 예외 상황이 발생하면 생성한 객체를 던진다(throw)

 - 던진다(throw) = 실제 자바 가상 머신에게 예외 객체를 만들어서 전달

 - 예외 객체를 던지면 곧바로 예외가 발생 

 - 자바 가상 머신은 그 예외를 처리할 수 있는 catch(){}블록에게 받았던 예외 객체를 전달

 - 'throw 예외 객체' 형식

 - throw 키워드 

   = 예외 객체를 던지는 기능을 수행

   cf> throws 키워드 

   = 예외를 상위 메서드로 전가 

 

throw me1;
throw me2;
throw new MyException();
throw new MyException("예외 메시지");
throw mre1;
thorw mre2;
throw new MyRTException();
throw new MyRTException("예외 메시지");

- throw로 예외를 던지면 곧바로 예외가 발생하므로 적절한 예외 처리 구문을 반드시 작성해야함

 

- 방법 1. 예외를 해당 메서드 안에서 직접 처리 

  -> 자바 가상 머신이 전달받은 예외 객체를 해당 메서드 내의 예외 처리 블록으로 전달

void abc(int age) {
	try{
    	if(age>=0)
        	System.out.println("정상값");
        else
        	throw new MyException(); //MyException 발생
     }catch(MyException e) {
     	System.out.println("예외 처리"); //예외 처리 구문 수행
     }
}
void bcd() {
	abc(-2);
}

 

- 방법 2. 예외를 상위 메서드로 전가해 예외 처리 

  -> 예외 객체를 상위 메서드 내의 예외 처리 블록으로 전달할 것 

void abc(int age) throws MyException { //예외 전가
	if(age >= 0)
    	System.out.println("정상값");
    else
     	throw new MyException(); //MyException 발생
 }
 void bcd() {
 	try{
    	abc(-2);
    } catch(MyException e) {
    	System.out.println("예외 처리"); //예외 처리 구문 수행
    }
}
package UserException;

//1.사용자 일반 예외 
class MyException extends Exception {
	public MyException() {
		super();
	}
	public MyException(String message) {
		super(message);
	}
}

//2.사용자 실행 예외 
class MyRTException extends RuntimeException {
	public MyRTException() {
		super();
	}
	public MyRTException(String message) {
		super(message);
	}
}

class A {
	//3.사용자 정의 예외 객체 생성
	MyException me1 = new MyException();
	MyException me2 = new MyException("예외 메시지 : MyException");
	
	MyRTException mre1 = new MyRTException();
	MyRTException mre2 = new MyRTException("예외 메시지:MyRTException");
	
	//4.예외 던지기(throw) : 던진 시점에서 예외 발생
	//방법 1. 예외를 직접 처리 
	void abc_1(int num) {
		try {
			if(num>70)
				System.out.println("정상 작동");
			else
				throw me1; //예외를 던진 시점에 예외 발생 
		}catch(MyException e) {
			System.out.println("예외 처리 1");
		}
	}
	void bcd_1() {
		abc_1(65);
	}
	
	//방법 2. 예외 전가 
	void abc_2(int num) throws MyException {
		if(num>70)
			System.out.println("정상 작동");
		else
			throw me1; //예외를 던진 시점에 예외 발생
	}
	void bcd_2() {
		try {
			abc_2(65);
		}catch(MyException e) {
			System.out.println("예외 처리 2");
		}
	}
}
public class UserException {
	public static void main(String[] args) {
		A a = new A();
		a.bcd_1();
		a.bcd_2();
	}
}

 

 

2. 예외 클래스의 메서드 

 

- 사용자 정의 예외 클래스는 Exception 또는 RuntimeException 클래스를 상속

- 추가 메서드를 정의하지 않아도 부모 클래스의 메서드를 고스란히 내려받음 

 

1) getMessage() 메서드 

 - 예외가 발생했을 때 생성자로 넘긴 메시지를 문자열 형태로 리턴하는 메서드 

 - 원형

public String getMessage()

- 예외 객체를 생성했을 때 메시지를 전달하지 않았을 경우 

try {
	throw new Exception();
} catch (Exception e) {
	System.out.println(e.getMessage()); //null
}

- 예외 객체를 생성했을 때 메시지를 전달했을 경우 

try {
	thorw new Exception("예외 메시지");
} catch(Exception e) {
	System.out.println(e.getMessage()); //예외 메시지 
}

 

2) printStackTrace() 메서드 

 - 예외 발생이 전달되는 경로, 즉 예외가 전가된 과정을 한눈에 확인할 수 있는 메서드 

 - 원형

public void printStackTrace()

- 클래스 A에는 3개의 메서드가 있고 cde() 메서드 내부에는 NumberFormatException이 발생하는 코드 포함 

- 모든 예외는 상위 메서드로 전가(throws)하고 있음

package UserException;

class A {
	void abc() throws NumberFormatException {
		bcd();
	}
	void bcd() throws NumberFormatException {
		cde();
	}
	void cde() throws NumberFormatException {
		int num = Integer.parseInt("10A"); //NumberException 예외 발생
	}
}
public class UserException {
	public static void main(String[] args) {
		//1.객체 생성 
		A a = new A();
		
		//2. 메서드 호출 + 예외 처리 
		try {
			a.abc();
		} catch(NumberFormatException e) {
			e.printStackTrace();
		}
	}
}

 - cde() 메서드에서는 NumberFormatException 에외가 발생하며, 이를 bcd() 메서드로 전달하고, 

이후 다시 abc() 메서드를 거쳐 main()메서드까지 전달됨

 - printStack() 메서드를 호출 -> 최초로 예외가 발생한 위치에서 해당 예외가 전달된 경로 확인 가능

 - Integer.parseInt() -> cde() -> bcd() -> abc() -> main() 순으로 출력

 

3. 사용자 정의 예외 클래스의 사용 예

 

 - 점수를 저장하는 scroe 변수에는 정수 0부터 100까지만 대입할 수 있으며, 이외의 값(음수,100보다 큰값)을 대입했을 때 일반 예외 발생

 - score 값이 음수 => MinusException 클래스 

 - score 값이 100을 초과 => OverException 클래스 

 

- 정수가 음수일 때 발생시킬 예외 클래스 

class MinusException extends Exception {
	MinusException() {
    }
    MinusException(String s) {
    	suoer(s); //부모 생성자 호출
    }
}

 - 점수가 100을 초과할 때 발생시킬 예외 클래스 

class OverException extedns Exception{
	OverException() [
    }
    OverException(String s) {
    	super(s); //부모 생성자 호출
    }
}

- 점수가 0 ~100 범위가 아닐 때는 예외가 발생하는 checkScore()메서드를 갖는 클래스 A

 => 두 예외를 모두 상위 메서드로 전가 

class A {
	void checkScore(int score) thorws MinusException, OverException {
    	if(score<0) {
        	throw new MinusException("예외 발생 : 음숫값 입력");
        }
        else if(score > 100) {
        	throw new OverException("예외 발생 : 100점 초과");
        }
        else {
        	System.out.println("정상적인 값입니다.");
        }
      }
 }

- A 객체의 checkScore() 메서드 호출로 발생하는 예외에 대한 예외 처리 

 => main() 메서드에서는 A 클래스의 객체를 생성해 checkScore() 메서드를 호출 

 => 다중 예외 처리 구문을 이용해 예외 처리 

public static void main(String[] args) {
	A a = new A();
    try {
    	a.checkScore(85); //정상적인 값입니다
        a.checkScore(150); //예외 발생 : 100점 초과 
    } catch (MinusException | OverException e) {
    	System.out.println(e.getMessage());
    }
}
package UserException;

//정수가 음수일 때 예외 발생 
class MinusException extends Exception {
	public MinusException() {
		super();
	}
	public MinusException(String message) {
		super(message);
	}
}

//정수가 100점을 초과할 때 예외 발생 
class OverException extends Exception {
	public OverException() {
		super();
	}
	public OverException(String message) {
		super(message);
	}
}

class A {
	void checkScore(int score) throws MinusException, OverException {
		if(score < 0) {
			throw new MinusException("예외 발생: 음숫값 입력");
		}
		else if(score > 100)
			throw new OverException("예외 발생 : 100점 초과");
		else 
			System.out.println("정상적인 값입니다.");
	}
}
public class UserException {
	public static void main(String[] args) {
		A a = new A();
		try {
			a.checkScore(85);
			a.checkScore(150);
		}catch(MinusException | OverException e) {
			System.out.println(e.getMessage());
		}
	}
}

'Java' 카테고리의 다른 글

15 -2장 쓰레드의 생성 및 실행  (0) 2023.06.14
15 - 1장 프로그램, 프로세스, 쓰레드  (0) 2023.06.13
14 - 3장 예외 전가  (0) 2023.06.13
14 - 2장 예외 처리  (0) 2023.06.13
14 - 1장 예외  (0) 2023.06.12