Java에서는 크게는 2가지 예외(Error, Exception) 작게는 3가지 예외(Error, RuntimeException, OtherException)가 존재한다. 그리고 지금 이 예외에 대해 알아보려고 한다.
Error
메모리 부족(OutOfMemoryError), ˚스택오버플로우(Stack Overflow) 처럼 가상 기계나 하드웨어 등 시스템의 문제로 발생하는 것을 의미한다.
즉, 개발자가 처리할 수 있는 영역이 아니기 때문에 Error가 발생하면 프로그램을 종료시키는 것이 보통이다.
스택오버플로우(Stack Overflow)란? Stack영역의 메모리가 지정된 범위를 넘어갈 때 발생하는 것으로 한 함수에서 너무 큰 지역 변수를 선언하거나 함수를 재귀적으로 무한정 호출하게 되면 발생할 수 있다. Stack Overflow가 발생하면 컴파일 옵션에서 Stack 영역의 크기를 늘리거나 또는, 함수에서 사용하는 지역 변수의 크기를 줄이거나 그게 아니라면 지역 변수를 전역 변수로 바꾸어 해결할 수 있다.
Stack이란? 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조(LIFO - Last In First Out)으로 되어있는 나열 구조로 stack 메모리는 보통 지역 변수가 저장되는 영역이다. 함수에서 지역 변수를 선언하면 지역 변수는 Stack 메모리에 할당되고 함수를 빠져나오면 Stack 메모리에서 해제된다. 하나의 프로그램이 실행될 때 수많은 함수를 호출하고 빠져 나오게 되는데 그때마다 함수에서 사용하는 지역 변수는 Stack영역에 할당되고 해제되는 것을 반복하게 되며 그에따라 사용하는 Stack 영역도 변하게 된다.
Exception
Error와 Exception의 차이는 개발자가 프로그램 내에서 처리할 수 있는지에 대한 여부이다. Exception은 Error와 다르게 프로그램내에서 처리해줄 수 있다.
즉, 예외가 발생하더라도 프로그램을 비정상 종료시키지 않는다.
Exception의 종류
Exception은 RuntimeException과 OtherException으로 나뉜다. 이들을 구분하는 차이는 컴파일러가 예외 처리를 하는지에 대한 여부이다.
RuntimeException
RuntimeException은 Error와 함께 컴파일러가 예외를 체크하지 않는다. 이들을 컴파일 후 런타임 시 발생할 수 있는 예외, 꼭 예외 처리를 해줄 필요없는 비체크 예외(Unchecked Exception)라고 부른다.
이 에러는 주로 프로그래밍 버그나 논리 오류에서 기인하는데 예를들어 Null 상태인 객체에 접근할 때 발생하는 NullPointerException 같은 것을 말한다. 이런 예외는 개발자가 처리해 줄 수도 있지만 개발자가 부주의해서 발생하는 경우가 대부분이며 어느정도 예측이 가능한 범위이기 때문에 반드시 예외처리를 할 필요는 없다.
OtherException
반대로 OtherException은 Error와 RuntimeException을 제외한 모든 예외를 의미하며 컴파일러가 예외를 체크해 준다.
이는 컴파일 시 발생되는 예외, 반드시 예외 처리를 해야하는 체크 예외(Checked Exception)라고 부른다.
이 에러는 무조건 예외 처리를 해줘야하며 만약, 예외처리를 하지 않으면 컴파일러가 컴파일 과정에서 컴파일 오류를 발생시켜버린다.
예외처리하는 방법으로는 두가지가 있는데 첫번째로는 잡아서 그자리에서 처리하는 try-catch-(finally), try-with-resources 등을 사용하여 예외가 발생 시 그 자리에서 처리해주는 방법과 자신이 처리하지 않고 throws를 통해 다른 메서드한테 예외 처리를 넘겨주는 방법인 2가지를 가지고 있다.