• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

[Java] 예외 종류
Java

[Java] 예외 종류

2022. 2. 8. 11:19

Java에서 예외는 Error, RuntimeException, OtherException 3가지 종류로 나뉜다.

먼저 Error는 메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverFlowError)등 JVM 또는 하드웨어적인 시스템의 문제로 발생하는 것을 의미한다.
다시 말해 개발자의 영역이 아님 시스템 영역의 문제이기 때문에 Error가 발생하면 프로그램을 종료시키는 것이 통상적이다.

다음으로는 큰 분류로 Exception이다.
Error와 Exception의 가장 큰 차이점은 개발자가 프로그램적으로 처리할 수 있느냐 없느냐의 차이이다.
즉, 예외가 발생하더라도 프로그램이 비정상 종료되는 일을 막을 수 있다.

Exception은 RuntiException과 OtherException으로 나누어 지는데, 이 두 Exception의 차이점은 컴파일러가 예외처리를 하는지 안 하는지에 대한 차이다.

RuntimeException은 Error와 마찬가지로 컴파일러가 잡아낼 수 없다.
또다른 말로는 'Unchecked Exception'이라고도 한다.

OtherException은 상기한 Error와 RuntimeException을 제외한 모든 예외를 뜻하고, 컴파일러가 예외를 잡아준다.
또 다른 말로는 'Checked Exception'이라고 한다.

RuntimeException은 주로 프로그래밍 실수나 논리 오류에서 발생하는데, 대표적으로 NullPointerException, IndexOutOfBoundsException 등이 있다.

RuntimeException 의미
ArithmeticException 어떤 수를 0으로 나눌 때 발생
NullPointerException Null 객체를 참조할 때 발생
ClassCastException 잘못된 클래스 형 변환
NegativeArraySizeException 배열의 크기가 음수인 경우
OutOfMemoryException 사용 가능한 메모리가 없는경우
NoClassDefFoundException 원하는 클래스를 찾지 못했을 때
ArrayIndexOutOfBoundsException 배열을 참조하는 인덱스가 잘못된 경우

이러한 예외는 개발자가 만든 코드에서 잘못된 부분을 알려주기 위해서 사용하는 것이다.
대게는 개발자의 부주의로 인해 발생하는 경우가 대부분이며, 예측 가능한 범위이기 때문에 타이트한 예외 처리가 필요 없는 것이다.

반면 OtherException은 무조건 예외처리가 필요하다.
만약 별도의 처리가 되어있지않으면 컴파일 과정에서 오류가 발생하므로 빌드조차 불가능하다.
예외처리 방식에는 여러가지 방법이 존재하지만 대표적으로 아래와 같은 방법이 있다.

OtherException 방법
예외를 잡아서 해당 코드블럭에서 처리하는 방법 try-catch-(finally)
메소드의 예외 발생 처리 방법 throw

먼저 try-catch를 사용하여 예외가 발생 시 해당 코드 블럭에서 처리해주는 방법이다.

---- try-catch ----
try{
    //do something
} catch (e: Exception){
    //handle Exception
}

---- try-catch-finally ----
try{
    //do something
}catch (e: Exception){
    //handle Exception
} finally{
    //무조건 동작 블럭
}

throw는 예외 발생 블럭에서 예외를 처리하지 않고 throws를 통해 상위 메소드한테 예외처리를 넘긴다.
이러한 동작은 '호출 스택'을 통해 수행되며, 기본적으로 메소드를 호출하면 호출 스택에 쌓이게 된다.
따라서 마지막으로 호출한 메소드에서부터 역순으로(LIFO) 올라가면서 예외 처리를 구현해둔 메소드를 찾아간다.

@Throws(Exception::class)
fun doSomething() {
   //something
}

이렇게 살펴본 Error, RuntimeException, OtherException의 구조는 아래 그림과 같은 형태로 나누어져 있다.

저작자표시 비영리 변경금지 (새창열림)

'Java' 카테고리의 다른 글

[Java] volatile 키워드  (0) 2021.12.27
[Java] Scanner와 BufferedReader  (0) 2020.11.23
    'Java' 카테고리의 다른 글
    • [Java] volatile 키워드
    • [Java] Scanner와 BufferedReader
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바