예외
모든 프로그래밍 코드는 오류가 발생할 가능성이 있다. 그냥 실수로 오타를 낼 수도 있고, 잘 모르고 문법에 안 맞게 코드를 짤 수도 있으며, 예상하지 못한 값이 들어오며 오류가 발생할 수도 있다. 이러한 오류는 Throwable 클래스(참고 링크)의 하위 Error 클래스(참고 링크)와 Exception 클래스(참고 링크)에 정의되어 있다.
오류(error)는 메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverFlowError)처럼 JVM이나 하드웨어 등 시스템의 문제로 발생하는 것이다. 그러므로 개발자가 다루기 힘들고, Error가 발생하면 프로그램은 종료된다.
그러나 예외(exception)는 발생하자마자 프로그램을 종료하지 않는다. 즉 개발자가 예외를 처리할 수 있다. 예외는 또 런타임(runtime)시 발생하는 런타임 예외(runtime exception)와 그 외 예외들로 나눌 수 있는데, 런타임 예외만은 컴파일러가 처리하지 못하는 비검사예외(unchecked exception)이고, 나머지 예외는 컴파일러가 감지 가능한 검사예외(checked exception)이다.
런타임 예외는 배열의 잘못된 인덱스에 접근하거나 NULL
상태인 객체에 접근할 때 등 상황에서 발생하는 예외인데, 반드시 처리하지 않더라도 코드가 동작하지만, 그 외 예외들은 처리해주지 않으면 안된다.
자주 발생하는 대표적인 예외로 아래와 같은 예외들이 있다.
예외 클래스 이름 | 원인 |
ArithmeticException | 0으로 나눌 때와 같이 잘못된 산술 연산 (런타임 예외) |
IndexOutOfBoundsExcetion | 범위를 벗어난 인덱스 접근 (런타임 예외) |
NoSuchElementException | 찾을 수 없는 원소 탐색 (런타임 예외) |
NullPointerException | NULL 을 가리키는 참조 변수 사용 (런타임 예외) |
NumberFormatException | 잘못된 형식의 숫자 변환 (런타임 예외) |
ClassCastException | 객체의 잘못된 형변환 (런타임 예외) |
ClassNotFoundException | 찾을 수 없는 클래스 사용 |
InterruptedException | 인터럽트가 발생 |
IOException | 입출력 문제 |
$ \vdots $ | $ \vdots $ |
커스텀 예외
Exception 클래스를 상속받아 예외를 만들수도 있다.
public class CustomException extends Exception {
...
}
이렇게 만든 예외는 throws
키워드를 통해 발생시킬 수 있다.
throws new CustomException();
생성자에 맞게 객체를 만들어서 예외를 발생시키면 된다.
예외 처리
try-catch-finally 를 이용하여 예외를 처리해줄 수 있다. 예외가 발생할 수 있는 코드 블럭을 try
문 앞에 넣고 catch
를 이용하여 각 예외, 혹은 전체 예외에 대하여 처리해준다. finally
는 예외가 발생하던 발생하지 않던 실행한다.
try {
...
Code that may raise an exception
...
} catch (Exceptiontype exception_varrable) {
...
} finally {
...
}
예외 타입은 Exception 클래스로 모든 예외를 처리하는 방식으로 설정할 수도 있고, 특정 예외만을 설정하여 다룰수도 있다. 여러 종류의 예외가 발생할 수 있다면 아래와 같이 다중 예외 처리도 가능하다.
try {
...
Code that may raise an exception
...
} catch (Exceptiontype1 exception_varrable1) {
...
} catch (Exceptiontype2 exception_varrable2) {
...
} finally {
...
}
혹은 자신이 처리하지 않을 수도 있다. 예를 들어 어떤 메소드가 호출되었을 때 해당 메소드에서 예외를 처리하기보다 메소드를 호출한 곳에서 예외를 처리하고 싶을 수 있다. 이때는 throws
키워드를 이용한다.
accessmodifier returntype methodname(parameter) throws Exceptiontype {
...
}
이렇게 메소드를 정의하면 예외 발생시 해당 메소드를 호출한 곳으로 예외를 넘긴다. 따라서 이 메소드를 호출할 곳에서 예외 처리를 해주어야 한다.
만약 예외 발생 및 전달 과정을 확인하고 싶다면 printStackTrace()
메소드를 활용하면 된다.
Exceptiontype e;
e.printStackTrace();
'Language > Java' 카테고리의 다른 글
[Java] 간단한 텍스트 파일 입출력 (0) | 2024.11.20 |
---|---|
[Java] 인터페이스(interface) 및 디폴트(default) 메소드와 정적(static) 메소드 (0) | 2024.11.16 |
[Java] abstract 키워드를 통한 추상 클래스와 추상 메소드 (0) | 2024.11.14 |
[Java] 업캐스팅(upcasting)과 다운캐스팅(downcasting) (0) | 2024.11.12 |
[Java] 클래스 상속(inheritance) (0) | 2024.11.12 |