본문 바로가기
JAVA

[JAVA] 예외 발생시키기, 사용자 정의 예외 클래스

by Amy IT 2022. 6. 1.

▶ 예외 발생시키기 - throw 키워드

 

시스템이 예외로 인식하지 않는 경우에도 필요에 따라 예외를 강제로 발생시켜야 하는 경우가 있습니다. 이 경우에는 throw 키워드를 이용하여 예외를 명시적으로 발생시켜야 합니다. 주의할 점은, throws 키워드(예외가 발생된 곳에서 예외를 직접 처리하지 않고 호출한 곳으로 예외 처리를 위임)와 구분해야 한다는 것입니다. 다음과 같이 throw 키워드를 사용합니다. 발생시킨 예외는 반드시 예외 처리해야 비정상 종료를 막을 수 있습니다. 

Exception e = new Exception([인자]); //객체 생성
throw e; //예외 발생시키기
throw new Exception([인자]); //한줄 작성 가능

 

num 값이 0보다 큰 경우 예외를 발생시키는 프로그램을 만들어보겠습니다. 시스템은 0보다 큰 것을 예외라고 인지하지 못하기 때문에 명시적으로 Exception 클래스를 객체 생성하고 throw 하여 예외를 발생시켜야 합니다. 발생된 예외를 try~catch 문과 throws 키워드로 처리하는 몇 가지 경우를 살펴보겠습니다. 

 

 

(1) main() 에서 예외 발생 => main() 에서 try~catch 문으로 직접 처리

public class ThrowTest1 {
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		int num = 10;
		try {
			if(num > 0) {
				throw new Exception("num은 0보다 큼"); //생성자에 메세지 넣어 생성
			}
		} catch (Exception e) {
			System.out.println("main에서 처리함: "+e.getMessage()); //메세지 출력 
		}
		System.out.println("프로그램 종료");
	}
}

 

(2) a() 에서 예외 발생 => a() 에서 try~catch 문으로 직접 처리

public class ThrowTest2 {
	public static void a() {
		int num = 10;
		try {
			if(num > 0) {
				throw new Exception("num은 0보다 큼");
			}
		} catch (Exception e) {
			System.out.println("a()에서 처리함: "+e.getMessage());
		}
		System.out.println("a() 종료");
	}
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		a();
		System.out.println("프로그램 종료");
	}
}

 

(3) a() 에서 예외 발생 => a() 에서 throws로 위임 => main() 에서 try~catch 문으로 직접 처리

public class ThrowTest3 {
	public static void a() throws Exception {
		int num = 10;
		if(num > 0) {
			throw new Exception("num은 0보다 큼");
		}
		System.out.println("a() 종료");
	}
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		try {
			a();
		} catch (Exception e) {
			System.out.println("main에서 처리함: "+e.getMessage());
		}
		System.out.println("프로그램 종료");
	}
}

 

(4) 특정 예외 클래스의 생성자에 메세지 넣어 생성하는 것도 가능

public class ThrowTest4 {
	public static int divide(int x, int y) throws ArithmeticException {
		if (y == 0) {
			throw new ArithmeticException("정수값을 0으로 나눌 수 없습니다."); 
		}
		return x/y;
	}
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		try {
			System.out.println(divide(2,0));
		} catch (Exception e) {
			System.out.println("main에서 처리함: "+e.getMessage());
		}
		System.out.println("프로그램 종료");
	}
}

 

 

 

 

 사용자 정의 예외 클래스

 

자바에서 제공하는 예외 클래스 외에 사용자가 직접 예외 클래스를 정의할 수 있습니다. 다음의 과정을 통해 사용자 정의 예외 클래스를 사용합니다.

 

  1. Exception 클래스를 상속받는 클래스를 선언합니다.
  2. 문자열을 인자로 받아 부모인 Exception 클래스에 전달하는 생성자를 작성합니다.
  3. 필요시 선언한 예외 클래스를 객체 생성 후 강제로 예외를 발생시킵니다. 

UserException이라는 이름의 예외 클래스를 선언하여 사용해 보도록 하겠습니다.

public class UserException extends Exception {
	public UserException(String message) {
		super(message);
	}
}

 

(1) 사용자 정의 예외 클래스를 사용하여 강제 예외 발생

public class UserTest1 {
	public static void check(int num) throws UserException {
		if (num < 100) {
			throw new UserException("num 값이 100보다 작다");
		}
	}
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		try {
			check(70);
		} catch (UserException e) {
			System.out.println("예외발생: "+e.getMessage());
		}
		System.out.println("프로그램 종료");
	}
}

 

(2) 자바에서 제공되는 예외 클래스를 사용자 정의 예외 클래스로 변환하여 강제 예외 발생

public class UserTest2 {
	public static void a() throws UserException {
		try {
			int num = 10;
			int result = num/0;
			System.out.println(result);
		} catch (ArithmeticException e) { //시스템이 던진 Exception 받음
			throw new UserException("0으로 나누어 예외발생"); //다시 강제 예외 발생
		}
	}
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		try {
			a();
		} catch (UserException e) {
			System.out.println("main에서 처리함: "+e.getMessage());
		}
		System.out.println("프로그램 종료");
	}
}

 

 

이상으로 예외 처리에 대한 내용 중 예외를 명시적으로 발생시키는 방법과 사용자 정의 예외 클래스를 사용하는 방법에 대해 알아보았습니다.

 

 

댓글