Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

josolha

예외처리 본문

JAVA

예외처리

josolha 2024. 4. 27. 12:26

예외란

 

 

 

 

예외는 크게 두 종류로 나뉘게 된다.
Checked Exception 와 Unchecked Exception 그리고 예외와 별개로 오류(Error)가 있다.


예외란 개발자가 로직을 잘못 짰거나 혹은 사용자가 잘못된 값을 넘겨 정상적인 프로그램 흐름에 벗어나는 행위를 말한다.

그래서 미리 예측을 하여 예외를 잡을 수 있다.

오류는 하드웨어에서 문제가 발생하는 경우도 있고, 완전 잘못된 로직을 짠 경우 등 시스템 레벨에서 발생하는 비정상적인 행위이기 때문에 이를 미리 예측해서 막을 수도 신경을 쓸 필요도 없다.

(오류 종류: OutOfMemoryError, StackOverflowError 등등)

 


Checked 예외와 Unchecked 예외

 

checked 예외란

런타임 시 발생하는 에러를 제외한 모든 Exception 클래스와 하위 클래스들을 카리 킨다.

컴파일 시점에 처리 코드 여부를 검사하기 때문에 Checked 예외라 부르기도 한다. (위에 노란부분)

 

IOException: 입출력 작업 실패 또는 인터럽트 시 오류

SQLException: 데이터베이스 접근 오류 발생 시 오류

ClassNotFoundException: 지정한 클래스를 찾을 수 없을 때 오류

등이 있다.

 

특히, checked 예외는 컴파일 시점에서 반드시 처리해야한다.

(throws(던지거나), try ~ catch 둘중 하나를 반드시 해야함)

 

checked 예외 예제)

public class CustomException2 extends Exception{
    public CustomException2(String msg) {
        super(msg);
    }
}

 

package exception;

class AddCalculator2 {
    public int add(int n1, int n2) throws CustomException2 {
        int result = n1 + n2;
        if (result < 0) {
            throw new CustomException2("컴파일 테스트");
        }
        return result;
    }
}

 

CustomException2Exception을 상속을 받은 Checked 예외로, 이 예외를 발생시키는 메서드는 예외를 처리하거나 선언해야 한다.

AddCalculator2 클래스에서는 add 메서드에서 CustomException2를 발생시키며 throws를 통해 메인에 던져준다

이 메서드를 사용하는 메인에서는 반드시 이 예외를 처리해야 한다.

package exception;

public class ExceptionApp {
    public static void main(String[] args) {
        AddCalculator2 ad = new AddCalculator2();
        try{
            ad.add(-1,-2);
        }catch (CustomException2 e){
            e.printStackTrace();
        }
    }
}

 

ExceptionApp 클래스는 AddCalculator2 클래스의 add 메서드를 사용한다.

따라서 이 메서드는 Checked 예외를 발생시킬 수 있으므로, try-catch 블록을 사용하여 앞에서 던져진 예외를 처리한다.


 

unchecked 예외란

런타임 시 발생하는 RuntimeException 클래스와 하위 클래스들을 카리 킨다.

컴파일 시점에 검사하지 않고 실행시 런타임 환경에서 확인해서 Unchecked 예외라 부르기도 한다. (위에 주황부분)

 

ClassCastException : 클래스 간의 형 변환 오류

ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 오류

NullPointerException :값이 null인 참조 변수를 사용할 때 발생하는 오류

등이 있다.

 

특히, Unchecked 예외는 프로그램의 실행 중에만 발견되며,

컴파일러가 이를 체크하지 않기 때문에, 예외 처리 코드를 작성하지 않더라도 컴파일 에러가 발생하지 않는다.

 

package exception;

public class CustomException extends RuntimeException{
    public CustomException(String msg) {
        super(msg);
    }
}

 

package exception;

class AddCalculator {
    public int add(int n1, int n2) {
        int result = n1 + n2;
        if (result < 0) {
            throw new CustomException("런타임 테스트");
        }
        return result;
    }
}

CustomExceptionRuntimeException울 상속받아 Unchecked 예외로 처리된다.

이 예외는 컴파일 시점에서 예외 처리를 강제하지 않으므로, 개발자의 선택에 따라 처리할 수 있다.

아래의 AddCalculator 클래스에서 음수 결과를 반환하려 할 때 CustomException을 발생시킨다.

 

public class ExceptionApp {
    public static void main(String[] args) {
        AddCalculator ad = new AddCalculator();
        ad.add(-1, -2);
    }
}

 

ExceptionApp 클래스는 AddCalculator2 클래스와는 다르게  throws나 try ~catch를 사용안해도 실행이 되는것을 볼수 있다.


결론

Checked 예외와 Unchecked 예외의 핵심 차이점은 처리의 필요성에 있다.

Checked 예외는 반드시 처리하거나 선언해야 하며, 이는 주로 외부 시스템과의 상호 작용 중 발생할 수 있는 예외들에 해당된다.

 

반면, Unchecked 예외는 주로 프로그램 내부에서 발생하는 로직 오류로 인해 발생하며, 이를 처리하는 것은 개발자의 재량에 달려 있다.

애플리케이션을 설계할 때, 예외 처리 전략을 명확히 하는 것은 매우 중요하다.

 

올바른 예외 처리 방법을 사용함으로써, 프로그램의 안정성과 유지보수성을 향상시킬 수 있으며, 사용자에게 더 나은 경험을 제공할 수 있다.이를 통해, 예외 상황에서도 프로그램이 우아하게 실패하고, 적절히 회복할 수 있는 기반을 마련할 수 있다.

 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

람다, 스트림API  (0) 2023.12.27
StringBuilder , System.out.println  (1) 2023.12.06
빌드도구  (0) 2023.07.28
Servlet, JSP, Tomcat, Apache - 웹 개발 기초 이해하기  (0) 2023.07.28