Back-End/Java

[Java /자바] 예외 처리(Exception Handling)

Kangharyeom 2022. 9. 13. 15:09
728x90

예외의 발생은 여러가지 방면에서 발생할 수 있다.

가령 사용자의 실수나, 네트워크의 불안정성, 디스크의 메모리부족, 개발자의 코드 에러 등 다양한 부분에서 예외가 발생한다.

 

그렇다면 이러한 예외는 어떻게 해결할 수 있을까?

 

java에서는 예외가 발생하게 되면 컴파일러가 컴파일을 멈추고 에러가 발생된다.

이러한 에러는 컴파일 에러와 런타임에러가 있다.

 

컴파일 에러

 

이름 그대로 컴파일을 할 때 발생하는 에러다.

새미콜론의 생략, 오탈자, 잘못된 포맷 및 자료형 등 문법적 오류를 뜻하게 된다. 

 

컴파일 오류는 IDE가 특정 라인에서 발생하는 오류를 빨간색으로 표시해주기 때문에 보다 쉽게 파악 할 수 있다. 

 

런타임 에러

 

런타임은 런타임시에 발생하는 에러를 뜻한다. 

또한 런타임에러는 JVM(Java Virtual Machine)에서 감지한다. 

주로 개발자가 컴퓨터가 수행 할 수 없는 작업을 요청 할 때 발생한다.

 

에러와 예외

 

일반적으로 프로그램과 관련된 문제는 에러라고 부르지만

전문적으로 프로그램 관련 문제는 에러(Error)와 예외(Exception)로 구분된다.

  • 에러(Error) : 발생하면 복구하기 어려운 수준의 오류
  • 예외(Exception) : 잘못된 코딩 및 사용에 대한 오류, 코드 수정을 통해 수습이 가능한 오류를 뜻한다. 

 

예외는 예외클래스로부터 객체를 생성하여 해당 인스턴스로 하여금 예외처리를 하게 된다.

위에 보이는 계층도는 그 구조를 설명해주고 있다.

 

예외는 Throwable클래스로부터 확장되어 Error, Exception클래스 다시 Runtime Exception, Other Exception으로 상,하위 클래스 구조를 가지고 있다. 

 

 

일반 예외 클래스

 

주로 잘못된 클래스 명이나 잘못된 데이터 형식으로 발생하는 예외다.

  • 잘못된 클래스명의 예외 (ClassNotFoundException)
  • 잘못된 데이터 형식의 예외 (DataFormatException)

 

실행 예외 클래스

 

자바 문법과 관련된 예외다.

  • 클래스간 형변환 오류 (ClassCastException)
  • 벗어난 배열 범위 지정 (ArrayIndexOutOfBoundsException)
  • 값이 null인 참조변수 사용 (NullPointerException)

등등의 오류가 있다.

 

 

예외의 처리 ( try -catch문)

 

예외의 처리는 잠재적으로 발생 할 수 있는 예외에 따라 비정상적인 종료나 오류를 대비하여 정상실행 할 수 있도록 처리하는 코드를 뜻한다. 

 

이러한 방법으로 try -catch문을 사용한다.

 

우선 try문에는 예외가 발생할 가능성이 있는 코드를 삽입한다.

그리고 catch문에는 예외가 발생했을 때 실행되는 코드를 삽입한다.

 

즉, 다음과 같이 진행된다.

try{
    //예외 발생 가능성이 있는 코드
    throw new Exception(); //강제 에러 출력 
}catch (Exception e){
    //예외 발생시 출력되는 코드
    System.out.println("예외 발생");
}finally{
    
}

이때 fanally문은 꼭 포함되지 않아도 된다. 

 

예외 전가(throws)

 

throws를 활용해 예외를 전가하는 방법도 있다.

예외를 호출한 곳에 예외를 떠넘기는 방식이다. 

 

 다음과 같이 던져줄 수 있다.

class Main {
    public static void main(String[] args) {
        try {
            throwException();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }
        static void throwException () throws ClassNotFoundException, NullPointerException {
            Class.forName("java.lang.StringX");
        }
}

 

다음 코드의 예외처리는 throwException이 아닌 main메서드가 하게된다. 

 

예외 발생

 

다음과 같이 의도적으로 예외를 발생시킬 수도 있다.

class Main {
    public static void main(String[] args) {
        try {
           Exception test = new Exception("의도적 예외");
           throw test; // 예외 선언
        } catch (Exception e) {
            System.out.println("의도적 예외가 발생했다!");
        }
    }
}