1. 예외란?
개념적으로 예외란, 어떤 이유로 컴퓨터가 더 이상 프로그램을 진행할 수 없는 상태가 되는 것을 의미한다. 예를 들어서 배열의 크기보다 큰 곳을 접근하려 한다던가, 0으로 수를 나누려 한다던가, 가져오려는 값이 Null일 경우 등등..
프로그램을 만들다 보면 수없이 많은 오류를 마주치게 된다. 이러한 오류들은 프로그램이 오동작을 하지 않도록 하기 위한 선기능이 있으며, 이러한 오류들을 무시하고 싶을 때도 있고, 오류가 날때 적절한 처리를 하고싶을 때도 있을 것이다.
이러한 예외들을 자바에서는 어떻게 처리하는지 살펴보고, 보다 안전하고 유연한 프로그래밍을 구사해보자.
2. 예외 처리 기본 (try / catch)
Java의 예외처리의 기법에 대해서 살펴보자.
다음은 예외처리를 위한 try, catch문의 기본 구조이다.
try{
...
}catch(예외1) {
...
}catch(예외2) {
...
...
}
try문 안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문 다음의 문장들은 수행되지 않는다.
하지만 try문 안의 문장을 수행하는 도중에 예외가 발생하면 예외에 해당하는 catch문이 수행된다.
가령, 숫자를 0으로 나누었을 때 발생하는 예외를 처리하자면 다음과 같다.
int n;
try {
n = 3 / 0;
} catch(ArithmeticException e) {
n = -1; // 예외가 발생하여 이 문장이 수행된다.
}
ArithmeticException이 발생하면 n에 -1을 대입하도록 예외를 처리한 것이다. ArithmeticException e에서 e는 ArithmeticException 클래스의 객체, 즉 오류 객체에 해당한다. 이 오류 객체를 통해 예외 클래스의 메서드를 호출할 수 있다.
일반적으로 쓰이는 예외처리구문은 다음과 같다.
catch로 에러를 잡아, 에러 메시지를 출력해주는 역할을 한다.
try{
...
}catch(Exception e){
LOG.error(e.getMessage(), e)
}
이렇게 작성을 하면, 에러가 발생했을 시 다음과 같이 에러 로그가 찍힌다.
Exception in thread "main" java.lang.NullPointerException
at ~~~(foo.java:3)
at ~~~(foo.java:5)
3. 예외 발생시키기 (throw)
예외를 강제로 발생시키는것이 throw이다. 코드를 작성하는 프로그래머가 강제로 예외를 발생시키는 것이다.
throw 예제를 보자면 다음과 같다.
...
public static void main(String[] args) {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("예외 발생!");
}
...
위 try catch문에서 try부분에 Exception 객체를 생성하여 throw로 강제로 예외를 내주었다.
강제로 발생된 Exception으로 catch문이 실행되어 "예외 발생!" 라는 문구가 콘솔창에 출력이 된다.
예외를 왜 강제로 발생시킬까?
4. 예외 던지기 (throws)
throws도 예외처리를 위해 사용된다. 하지만 예외를 상위쪽으로 미루어 처리한다는 것이 다르다.
public void test(String a, String b) throws NumberFormatException{
int sum = Integer.parseInt(a) + Integer.parseInt(b);
System.out.println("문자로 입력받은 " + a + ", " + b + "의 합은 " + sum + "입니다.");
}
만일 위와 같은 메서드가 있다고 가정하자. 문자로 입력받은 a, b가 숫자 형식이 아닐 경우, NumberFormatException 예외가 발생한다.
따라서 이를 호출하는 곳에서 다음과 같이 예외를 받아 처리할 수 있게 된다.
try{
test("1", "a");
} catch(NumberFormatException e) {
System.out.println("입력한 값중 숫자가 아닌 값이 있습니다.");
}
#References
'Java' 카테고리의 다른 글
[Java] Null Check (0) | 2022.11.25 |
---|---|
[Java] JSON 변환 라이브러리 Jackson에 대해 (0) | 2022.11.22 |
[Java] 빌더 패턴(Builder Pattern)에 대해 (0) | 2022.08.30 |
[Java] Ubuntu에 AdoptOpenJDK 설치 (0) | 2022.08.10 |
Java로 간단한 콘솔 연락처 프로그래밍 (0) | 2021.07.09 |