본문 바로가기
[ JAVA ]/JAVA

[ Java ] 예외처리(Exception Handling)

by 환이s 2023. 1. 4.
CHAPTER 18. Exception Handling 알아가기

 프로그램을 실행 중 어떤 원인에 의해 프로그램이 해당 상황에 대처를 하지 못할 경우 비정상적으로 종료되거나 에러 팝업창이 뜨는 경우가 있습니다.  오늘의 포스팅은 오류가 발생했을 때 대처하는 방법인 예외처리에 대해서 해보려 합니다!!

 

1 ) 예외처리(Exception Handling)란?

 

프로그램이 실행되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것입니다.

 그럼 예외가 왜 발생할까?? 

 

1-1 ) 예외가 발생하는 원인

 

  •  시스템 장애

-네트워크 오류

-사용권한 문제

  • 사용자의 입력 실수

-존재하지 않는 파일 이름 입력

-숫자값 입력란에 일반 문자 입력

-받아들일 수 없는 연산

 

 

2 ) 에러, 경고, 예외

 

  • Error

- 컴파일이 안됨

  • Warning

- 실행은 되지만 성능 저하 등의 문제가 발생 가능성이 있습니다.

  • Exception

- 컴파일과 실행은 되지만 프로그램이 비정상적으로 종료되는 경우

 

3 ) 예외 처리를 하는 경우

 

- 선택적인 예외 처리 : 예상되는 코드에 처리

- 필수적인 예외 처리 : 파일입출력, 네트워크 관련 작업, DB연동 등

 

예외 클래스의 계층구도

  • Error : 자바 가상 기계 안에서 치명적인 오류가 발생
  • RuntimeException : 프로그래밍 버그나 논리 오류에서 기인한다.

 

※ RuntimeException 예외의 종류

분 류 예 외 설 명
RuntimeException ArithmeticException 어떤 수를 0으로 나눌 때 발생한다.
NullPointerException Null 객체를 참조할 때 발생한다.
ClassCastException 적절치 못하게 클래스를 형변환하는 경우
NegativeArraySizeException 배열의 크기가 음수값인 경우
OutOfMemoryException 사용 가능한 메모리가 없는 경우
NoClassDefFoundException 원하는 클래스를 찾지 못하였을 경우
ArrayIndexOutBoundsException 배열을 참조하는 인덱스가 잘못된 경우

 

4 ) 예외 처리를 하는 방법 

 

  • try ~ catch 구문에 의한 방법

 

try ~ catch 문은 주로 쓰는 구간이 데이터베이스에 데이터를 주고받을 경우 많이 사용합니다. 데이터베이스와의 연결을 끊어주는 코드를 주로 삽입하는데, 특정 예외가 발생하여 데이터베이스와의 연결이 끊어지지 않으면 여러 가지 문제를 야기할 수 있기 때문입니다.

 

try{
//예외가 발생할 가능성이 있는 코드
}catch(Exception e){
//예외가 발생했을 때의 코드
}finally{
//예외 발생 여부에 관계없이 항상 실행되는 코드
}

try 블록에는 예외가 발생할 수 있는 코드가 위치합니다. try 블록의 코드가 예외없이 정상 실행되면 catch 블록의 코드는 실행되지 않고

finally 블록의 코드를 실행 합니다. 하지만 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이용하여 예외처리 코드를 실행합니다.  또한 finally 블록의 코드도 실행합니다. ( finally 블록은 생략 가능합니다! )

 

 

그럼 예제를 통해서 알아봅시다.

 

다음 코드는 배열 인덱스 값을 넣고 출력하는 코드입니다. 하지만, 이 코드는 코드 수행 시 에러가 발생합니다.

public class NegariveEx {
    public static void main(String[] args) {
        try {
            int arr[] = new int[3];
            arr[3] =20; // 배열 인덱스는 0~2
        }catch (ArrayIndexOutOfBoundsException e){ //예외 코드를 잘 모를땐 Exception만 해도 됩니다.
            System.out.println(e.getMessage()); // 오류 메세지를 리턴
            e.printStackTrace(); ////예외가 발생한 상태의 스택정보 출력
        }
}
}

 

이 에러가 발생하는 이유는 길이가 3인 배열의 index 3을 찾으려 하기에 에러가 발생했다는데, 예외 클래스명과 연관 지어서 생각하면, 배열의 길이를 벗어난 index의 값을 가져오려 했기에 생긴 문제입니다.

 

  • throws 구문에 의한 방법

 

throws 키워드는 현재 메서드에서 자신을 호출한 상위 메서드로 Exception을 발생 시킵니다. 즉, throws 키워드는 사용하는 메서드를 호출한 상위 메서드에서 이러한 에러 처리에 대한 책임을 맡게 됩니다.

 

void method() throws (예외처리클래스) {
}

 

그럼 예제를 통해서 알아봅시다.

 

public class Test {
    public static void myException() throws Exception{
        throw new Exception();
    }
    public static void main(String[] args) {
        try {
         myException();

        } catch (Exception e){
        e.printStackTrace();
            System.out.println("예외가 발생하였습니다.");
        }

    }
}

 

일반적으로 throws를 사용하면 try ~ catch 구문이 생성되지 않는 것을 확인할 수 있는데, 그 이유는 throws구문에 의해 예외에 대한 처리를 호출부로 위임하기 때문입니다.

 

5 ) 예외가 발생할 경우의 해결 방법

 

예외 발생시 예외에 대한 정보를 printStackTrace() ,getMessage() 명령어를 통해 얻을 수 있습니다.

 

  • printStackTrace() : 예외 발생 당시 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력합니다.
  • getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있습니다.

 

 

6 ) throw(예외 발생시키기)

 

개발자가 의도적으로 예외를 발생시키는 것 또한 가능합니다.

throw 키워드를 사용하면 되는데, 주로 사용자가 구현하는 비즈니스 로직에서 컴파일의 문법 오류는 없지만 로직 자체가 개발자가 의도한 대로 진행되는지에 대한의 검증(Validation) 로직을 통과하지 못했을 경우에 고의로 예외를 발생시켜야 할 때 사용합니다.

즉, 테스트용 외에는 거의 쓸 일이 없습니다.

 

    static void test(int n){
        if(n == 0){
            throw  new NullPointerException();
            //throw new 예외클래스(); => 특정한 조건에 인위적 예외를 발생시킴
        }
    }
    public static void main(String[] args) {
        test(0);
    }
}

※ throw , throws 키워드는 비슷하지만 다른 용도로 사용됩니다!! 주의!!

 

- throw는 Excepion을 발생시킬 때 사용하는 키워드입니다. 만약 어떤 연산을 하다가 예상치 못한 일이 발생했을 때 Exception을 발생시켜 예외가 처리될 수 있도록 합니다

 

- throws는 메서드를 정의할 때 사용하며, 이 메서드에서 발생할 수 있는 Exception을 명시적으로 정의할 때 사용합니다.

 

7 ) Method Call Stack

 

호출스택(Call Stack)이란 메서드가 실행될 때 필요한 메모리가 제공되는 공간입니다. 메서드가 호출되면 호출스택에 메모리가 할당되고 종료되면 해체됩니다.(생성과 소멸)

즉, 어떤 메서드 안에서 예외가 발생하면 런타임 시스템은 그 메서드 안에 예외 처리기가 있는 지를 살핍니다. 만약 그 자리에 예외 처리기가 없다면 호출스택(Call Stack)에 있는 상위 메서드를 조사하게 됩니다.

 


마치며

 

자바의 예외처리에 대해서 알아보았습니다. 예외처리는 자바에서 난이도가 있는 부분에 속합니다. 실제 프로젝트에서도 트랜잭션 관리를 잘못하여 고생하는 경우를 많이 보았는데... 예외처리는 부분만 알아서는 안되고 전체를 관통하여 모두 알아야만 정확히 할 수 있습니다!!

 

728x90

'[ JAVA ] > JAVA' 카테고리의 다른 글

[ Java ] GUI 프로그래밍 개념  (2) 2023.01.07
[ Java ] Thread  (0) 2023.01.05
[ Java ] 내부 클래스(Inner Class)  (0) 2023.01.03
[ Java ] Scanner  (0) 2022.12.29
[ Java ] Collection Framework  (0) 2022.12.28