[JAVA] 예외와 예외 클래스

에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는 프로그램을 아무리 견고하게 만들어도 결국 실행 불능이 됩니다. 개발자는 이런 에러에 대처할 방법이 전혀 없습니다.

하지만 이런 에러 이외에 exception이라고 부르는 것이 존재합니다.

exception은 프로그램이 종료된다는 점에서 에러와 동일합니다. 하지만 exception은 exception handling을 통해서 프로그램을 종료하지않고 정상 실행 상태가 유지되도록 할 수 있습니다.

[출처 https://www.nextree.co.kr/p3239]

exception에는 두 가지가 존재합니다. 하나는 일반 예외(exception), 다른 하나는 실행 예외(runtime exception)입니다. 일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일 하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문입니다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생합니다. 가끔씩 개발하다보면 try catch문을 안걸어주면 생기는 컴파일 에러가 이러한 상황에 해당합니다.

실행 예외는 컴파일하는 과정에서 예외 처리를 검사하지 않는 에러를 의미합니다. 컴파일 시 예외 처리를 확인하는 차이일 뿐 사실 두 가지 예외는 모두 예외 처리가 필요합니다. 자바에서는 예외를 클래스로 관리합니다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성합니다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해줍니다. 모든 예외 클래스들은 다음과 같이 java.lang.Exception 클래스를 상속받습니다.

일반 예외와 실행 예외 클래스를 구별하는 방법은 일반 예외는 Exception을 상속받지만 Runtime exception은 상속받지 않는 클래스들이고 실행 예외는 다음과 같이 Runtime exception을 상속받은 클래스들입니다. Runtime exception 역시 exception을 상속받지만 JVM은 Runtime exception을 상속했는지 여부를 보고 실행 예외를 판단합니다.

실행 예외

그러면 이제 어떠한 실행 예외들이 존재하는지 알아보겠습니다.

NullPointException

자바 프로그램에서 가장 빈번하게 발생하는 실행 예외입니다. 이것은 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트 . 를 사용했을 때 발생한다.

👀 객체가 없는데 객체를 사용하려고 했으니 발생하는 예외이다.

ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과하여 사용할 경우 발생하는 실행 예외이다.배열의 길이가 3인데 4번째 인덱스에 접근하려고하면 발생한다.

NumberFormatException

프로그램을 개발하다 보면 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 자주 발생한다. 문자열을 숫자로 변환하는 방법은 여러 가지가 있지만 가장 많이 사용되는 코드는다음과 같다.
Integer.parseInt(String s)
Double.parseDouble(String s)
그런데 문자열 중, "a100" 같은 경우는 변환이 불가능하다. 이런 경우 발생하게 된다.

ClassCastException

타입 변환은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다. 이러한 관계가 아니라면 클래스는 다른 클래스로 타입 변환할 수 없다.
Animal animal = new Dog();
Cat cat = (Cat) animal;
와 같이 타입형을 변환하려면 에러가 터집니다.
따라서 아래와 같이 instanceof를 활용하면 좋습니다.

Animal animal = new Dog();
Cat cat = (Cat) animal;

Animal animal = new Dog();
if(animal instanceof Dog){
	Dog dog = (Dog) animal;
    }
    else if(animal instanceof Cat){
    Cat cat = (Cat) animal;
    }

}

좋은 웹페이지 즐겨찾기