본문 바로가기
Programming/Java * Spring

[Java] 11. 예외처리(Exception) 상속구조, finally, throws

by 고막고막 2019. 3. 29.

등장 배경

C언어 시절에는 예외처리를 if문(if, else if, else)으로 처리했다. 단점은 실행코드와 예외처리 코드가 지나치게 반복되고, 실행코드보다 예외처리코드가 훨씬 더 많아지게 되었다. 그러므로 코드의 가독성이 낮아지는 결과도 생겼다.

그래서 C++은 실행코드 영역과 예외처리 영역을 분리하는 예외처리 문법을 도입하였다. 자바는 C++을 모태로 탄생되었고, C++에 비해서 예외처리를 훨씬 더 강화해 설계하였다.

상속 구조

ArithmeticException의 상속구조

예외(Exception)와 에러(Error)는 모두 Throwable의 상속을 받는다. 예외는 내(프로그래머)가 짠 코드 상의 문제가 있는 것으로 코드를 수정하면 해결되고, 에러는 시스템 상에서 발생한 비정상적인 상황으로 프로그래머의 통제를 받지 않는다.

Finally

try ~ catch 문에서 예외상황 발생 유무와 관계없이 실행되는 구문. close(); 등을 넣을 때 활용한다.

public static boolean divider(int num1, int num2) {
	try {
		int result = num1/num2;
		System.out.println("나눗셈 결과는 "+result);
		return true;
	} catch (ArithmeticException e) {
    	System.out.println(e.getMessage());
		return false;
	}finally {
		System.out.println("finally 영역 실행");
	}
}

Throws

예외처리를 해당 매서드/클래스에서 자신을 호출한 곳으로 넘김. 단, Main 매서드로 throw 하게 되면 JVM으로 넘기게 된다. 예외를 바로 처리하지 않더라도 실행코드와 예외처리 코드를 분리하고, 한번에 처리할 수 있어 코드의 가독성이 좋아진다. printStackTrace() 또는 getMessage()를 통해 예외의 자세한 내용(예외가 어디에서, 왜 발생했는지)을 확인할 수 있도록 한다.

public static PersonalInfo readPersonalInfo() throws AgeInputException, NameLengthException{
	String name = readName();
	int age = readAge();
	PersonalInfo pInfo = new PersonalInfo(name, age);
	return pInfo;
}

public static String readName() throws NameLengthException{
	System.out.println("이름 입력");
	String name = keyboard.nextLine();
	if(name.length()<2)							// 이름이 두글자보다 짧을때
		throw new NameLengthException(name);	// 강제로 예외 발생시키겠다
	return name;
}

public static int readAge() throws AgeInputException{
	System.out.println("나이 입력");
	int age = keyboard.nextInt();		
	if(age<0)							// 나이가 0보다 작을때
		throw new AgeInputException();	// 강제로 예외 발생시키겠다
	return age;
}
public static void main(String[] args) {
	try {
		PersonalInfo readInfo = readPersonalInfo();
		readInfo.showPersonalInfo();
	} catch (AgeInputException e) {
		e.printStackTrace();
	} catch(NameLengthException e){
		e.showWrongName();
		e.printStackTrace();
	}	
}

Exception 종류