본문 바로가기
언어/Java

예외 (Exception)

by 넬준 2022. 6. 28.

 

Error vs Exception

 

 Error는 시스템 레벨에서 비정상적인 상황이 일어났을 때 발생한다.  Error가 발생하면 프로그램을 더 이상 실행할 수 없다. 이런 Error는 시스템 레벨에서 발생하기 때문에 개발자가 프로그램 코드로 대처할 수 없다. 

 

 Exception은 개발자의 코드나 사용자에 의해 발생하는 프로그램 레벨의 오류를 뜻한다. Error와 마찬가지로 Exception이 발생하면 프로그램이 바로 종료되지만, Exception Handling을 해주면 정상적으로 프로그램을 작동할 수 있다.

 

 

출처 - https://www.nextree.co.kr/p3239

 

 위 구조도를 보면 Error 클래스와 Exception 클래스는 Throwable 클래스를 확장(상속)하고 있다.  Throwable 클래스에 정의된 method들 중 가장 많이 쓰이는 것은 다음과 같다.

 

//예외 이유를 리턴하는 method
public String getMessage()

//예외 발생 코드를 추적해 예외 발생 위치 등을 콘솔에 출력해주는 method
public void printStackTrace()

 

Checked Exception vs Unchecked Exception

 Java에서 Exception은 RuntimeException을 확장(상속)하는 예외 클래스, 그 외 나머지에 해당하는 예외 클래스로 나눈다.

RuntimeException을 확장하는 예외 클래스를 Unchecked Exception, 그 외 예외 클래스를 Checked Exception이라고 부른다.

 

 이 두 예외 모두 프로그램이 정상적으로 작동하기 위해서는 예외 처리를 해줘야 한다. 하지만 차이점은 컴파일하는 과정에서 이 예외 처리 여부를 체크하는지 안하는지 여부다.

 이름에서도 알 수 있듯이 Checked Exception은 컴파일러가 예외 처리 여부를 확인하고, 처리가 되어있지 않으면 IDE에서 흔히 말하는 빨간줄이 그어지게 된다. Unchekced Exception은 RuntimeException을 확장하는 만큼 컴파일러가 체크하지 않는다. 그렇기 때문에 개발자가 본인의 지식과 경험으로 예외 처리를 미리 해야 프로그램이 강제 종료되는 일을 막을 수 있다.

 

 

예외 처리

 JVM은 프로그램을 실행하다가 예외가 발생하면, 해당 예외의 클래스 객체를 생성한다. 따라서 이 예외 객체를 이용해 적절한 예외 처리를 할 수 있다.

 

 예외는 try-catch-finally 블록을 이용해 처리할 수 있다.

 

try {

	예외 발생 가능성이 있는 코드

} catch(예외클래스1 e) {

	예외 발생 시 실행되는 코드

} catch(예외클래스1의 상위 예외클래스 e) {

	예외 발생 시 실행되는 코드

} finally {

	예외 발생 여부와 상관 없이 실행되는 코드

}

 

try 블록에 실행 시 예외가 발생할 가능성이 있는 코드를 작성한다. 해당 코드를 실행하다 실제로 예외가 발생하면 catch 블록으로 코드의 흐름이 이동한다. 

 

여기서 주의할 점이 있다. try 블록 내부에서 다양한 종류의 예외가 발생할 수 있기 때문에 catch 블록을 여러 개 작성해 이를 처리할 수 있다. 단, 여러 catch 블록 중 실행되는 블록은 단 하나뿐이다. 그리고 catch 블록 순서가 중요한데, 아래로 내려갈수록 상위 예외 클래스를 작성해야 한다. 위에서부터 catch 블록을 찾아보기 때문에 이런 순서로 작성해야 좀 더 상세한 예외 처리가 가능하다.

 

try {

	예외 객체 생성
    
} catch(예외클래스 e) {
	//예외 메시지 얻기
	String meesage = e.getMessage();
    
	//예외 정보 콘솔에 출력
	e.printStackTrace();
} finally {

}

Throwable 클래스에 정의된 getMessage(), printStackTrace()를 이용해 예외 처리를 하는 경우가 많다.

 

 

예외 던지기

위에서는 예외를 직접 처리하는 코드를 봤다. 하지만 예외를 직접 처리하지 않고, 예외가 발생하는 method를 호출한 곳으로 예외를 던질 수 있다. 즉, 예외 처리 책임을 넘기는 것이다. throws 키워드를 method signature 끝에 붙이고 뒤에는 해당 예외 클래스를 적어주면 된다.

 

public 리턴자료형 methodName(param...) throws 예외클래스1, 예외클래스2 {

}

 

throws 키워드가 붙은 method를 호출하는 곳에서도 직접 예외를 처리할 수도 있고, 또 예외를 자신을 호출할 곳으로 던질 수도 있다. 반드시 한 군데에서만이라도 예외 처리를 해주면 된다.

 

 

 


참고

 

https://www.nextree.co.kr/p3239/

https://travelbeeee.tistory.com/454

https://ko.gadget-info.com/difference-between-error

 

'언어 > Java' 카테고리의 다른 글

String 연산  (0) 2022.07.17
Arrays.asList()  (0) 2022.05.30
배열과 맵 toString()  (0) 2022.05.25
OOP의 특성 - 2. 다형성  (0) 2022.05.13
OOP의 특성 - 1. 상속  (0) 2022.05.12

댓글