본문 바로가기

java

[java/기본] 예외 처리

프로그램을 실행하다보면 정상적 작동에서 벗어나 발생하는 오류로 인해 프로그램이 중단될 수 있고 이를 막아야 한다.

에러는 크게 두가지다.

 

exception

프로그램 코드의 컴파일 혹은 런타임에서 발생하는 소프트웨어 에러이다.

이는 예외 처리를 통해 프로그램 중단을 막을 수 있다.

 

error

코드 외적인 에러로 하드웨어 에러나 환경 에러를 의미한다.

(ex: 파워 불량, jvm 문제 등)

이는 예외 처리가 불가능하다.

 

우리가 다룰 건 Exception이다.

 

Exception 종류


checked exception

코드에서 예상할 수 있으며 컴파일 단계에서 예외 처리가 강제된다.

IOException, SQLException 과 같은 외부 리소스 처리가 주로 해당된다.

 

uncheckd exception

프로그램에서 예상할 수 없는 상황이나 개발자의 실수에 의해 발생하며, 예외 처리가 강제되지 않는다.

NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException 등.

예외처리는 개발자의 선택사항이다.

 

예외 처리 방법


try catch finally

예외 발생 지점에서 즉시 예외 처리를 한다.

try 문, catch문, finally문으로 구성된다.

 

try

에러가 발생할 가능성이 있는 문장이 실행되는 부분이다.

에러 발생 시, 블록의 코드 실행을 중단 후 catch로 넘어간다.

 

catch

try에서 에러가 발생할 시, 에러의 타입 조건에 부합하는 catch문이 실행된다.

catch문은 여러개 작성 가능하며 타입으로 나눌 수 있다.

try {
// 실행될 문장
}
catch(예외타입1 e){
// 예외타입1이면 실행
}
catch(예외타입2 e){
// 예외타입2이면 실행
}

 

finally

finally는 try catch 이후에 에러 여부에 상관없이 반드시 실행되는 문장이다.

finally는 생략이 가능하다.

주로 외부 리소스를 해제할 때 사용한다.

 

Exception 클래스

예외 발생 시, catch문 같은 방식에서 잡히는 예외 객체는 로깅에 유용한 메소드를 제공한다.

e.printStackTrace() 에러 메시지 전부 출력한다.

getMessage 에러 메시지만 반환한다.

getClass 에러의 종류만 반환한다.

public class Main {

	public static void main(String[] args) {

		try {

			System.out.println(a / b);

		} catch (Exception e) {

			e.printStackTrace();

			System.out.println(e.getMessage());

		} finally {

			System.out.println("heeloo");

		}

	}

}

 

throw

예외 발생 시, 호출 스택에 따라 상위 메소드로 에러를 전달한다.

 

형식

public class Main {

	public static void main(String[] args) {

		Main a = new Main();

		try {

			a.first();

		} catch (Exception e) {

			System.out.println(e.getClass());

			e.printStackTrace();

			System.out.println("에러띠 errir");

		}

		System.out.println("에러띠");

	}

	// 어떤 예외를 던질 지 선언
	private void first() throws Exception {

		System.out.println("first");

		this.second();

	}

	private void second() throws Exception {
// 혹은 throw new Exception(); 이런 식으로 바로 에러를 던질 수도 있다.
		System.out.println("second");

		int a = 10 / 0;

	}

}