ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 예외 처리
    Language/Java 2022. 9. 29. 13:41

    예외 처리

    예외 처리란?

    자바에서 예외 처리란 프로그램 실행 중 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이며, 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스러운 비정상적인 종료를 막고 실행상태를 유지하는 것에 있다.

     

    자바에서의 예외 처리 방식은 아래와 같다.

     

    1. 예외가 발생한 메서드 내에서 직접 처리하는 방법

    2. 예외가 발생한 메서드를 호출한 곳으로 예외 객체를 넘겨주는 방법

    3. 사용자 정의 예외를 생성하여 처리하는 방법

     

    예외가 발생한 메서드 내에서 직접 처리하는 방법
    try {
        
        예외 발생 가능성이 있는 코드
        
    } catch (예외타입01 매개변수명) {
    
        예외타입01의 예외가 발생할 경우 처리 코드
    
    } catch (예외타입02 매개변수명) {
    
        예외타입02의 예외가 발생할 경우 처리 코드
    
    } finally {
    
        항상 수행할 필요가 있는 코드
    
    }

    try 블록은 예외가 발생할 가능성이 있는 범위를 지정하는 블록이다. try 블록은 최소한 하나의 catch 블록이 있어야 하며, catch 블록은 try 블록 다음에 위치한다.

     

    catch 블록의 매개변수는 예외 객체가 발생했을 때 참조하는 변수명으로, 반드시 java.lang.Throwable 클래스의 하위 클래스 타입으로 선언되어야 한다.

    지정된 타입의 예외 객체가 발생하면 try 블록의 나머지 문장들은 수행되지 않고, 자바 가상 머신은 발생한 예외 객체를 발생시켜 동일한 예외 객체 타입을 가진 catch 블록을 수행한다.

     

    finally 블록은 필수 블록은 아니다. finally 블록이 사용된다면 예외 예외 발생의 유무와 상관없이 무조건  finally 블록의 내용이 수행된다. 따라서, 데이터베이스나 파일을 사용한 후 닫는 기능과 같이 항상 수행해야 할 필요가 있는 경우에 활용된다.

     

    public class Main {
    
        public static void main(String[] args) {
            String[] name = new String[2];
    
            try {
                name[0] = "이순신";
                System.out.println("이름 : " + name[0]);
    
                name[1] = "강감찬";
                System.out.println("이름 : " + name[1]);
    
                name[2] = "홍길동";
                System.out.println("이름 : " + name[2]);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("배열 참조 에러 발생");
            } finally {
                System.out.println("시스템 종료");
            }
        }
    }
    이름 : 이순신
    이름 : 강감찬
    배열 참조 에러 발생
    시스템 종료

    1. String[2] 배열을 선언한 상태에서, 3번째 배열에 값을 대입할 때 예외가 발생한다.

    2. ArrayIndexOutOfBoundsException 예외가 발생하면 해당 예외 타입을 가진 catch 블록이 실행된다.

    3. 최종적으로, finally 블록이 실행되며 "시스템 종료" 메시지가 출력된다.

     

    예외가 발생한 메서드를 호출한 곳으로 예외 객체를 넘기는 방법

    자바에서는 try-catch 또는 try-catch-finally 블록을 이용하지 않고도 예외가 발생한 메서드를 호출한 지점으로 예외를 전달하여 처리하는 방법이 있다. 이때 사용하는 키워드가 바로 throws이다.

    throws는 어떠한 메서드의 내부 소스코드에서 에러가 발생했을 때, 예외 처리를 try-catch로 하는 것이 아니라 메서드를 사용한 곳으로 책임을 전가하는 방법이다.

     

    public class Main {
    
        public static void main(String[] args) {
    
            try {
                callDriver();
            } catch (ClassNotFoundException e) {
                System.out.println("클래스를 찾을 수 없습니다.");
            } finally {
                System.out.println("시스템 종료");
            }
        }
    
        static void callDriver() throws ClassNotFoundException {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("완료");
        }
    }
    클래스를 찾을 수 없습니다.
    시스템 종료

    1. main에서 callDriver( ) 메서드를 호출한다.

    2. callDriver( ) 메서드에서 "oacle.jdbc.driver.OracleDriver" 클래스를 가져온다.

    3. 해당 클래스를 찾지 못하면 ClassNotFoundException이 발생하는데, callDriver( ) 메서드에서는 throws ClassNotFoundException 처리를 통해 main에 해당 예외를 넘긴다.

    4. main에서는 ClassNotFoundExcepion 예외에 해당하는 catch 블록을 실행시키며, "클래스를 찾을 수 없습니다." 메시지를 출력한다.

     

    사용자 정의 예외 생성
    class 예외클래스이름 extends Exception {
    }

    기존의 예외 클래스로 예외를 처리할 수 없다면 사용자가 직접 예외 클래스를 작성해 발생시킬 수 있다. 사용자가 예외 클래스를 직접 정의하기 위해서는 예외 클래스의 최상위 클래스인 java.lang.Exception 클래스를 상속받아 클래스를 정의해야 한다.

     

    public class MyException extends Exception {
    
        public MyException() {
            super("내가 만든 예외");
        }
    }

    Exception을 상속받는 MyException 예외를 생성했다. 해당 클래스는 "내가 만든 예외"라는 메시지를 갖는다. 사용자가 정의한 예외를 처리하는 방법은 아래와 같다.

     

    public class Main {
    
        public static void main(String[] args) {
    
            try {
                callException();
            } catch (MyException e) {
                System.out.println(e.getMessage());
            } finally {
                System.out.println("시스템 종료");
            }
    
        }
    
        static void callException() throws MyException {
            throw new MyException();
        }
    }
    내가 만든 예외
    시스템 종료

    1. main 로직이 실행되면서 callException( ) 메서드를 호출한다.

    2. callException( ) 메서드는 MyException 객체를 생성한 후 main 로직으로 전달한다.

    3. MyException을 받은 main은 catch에서 해당 예외를 받은 후 예외 메시지를 출력한다.

    4. 최종적으로 finally가 실행되어 "시스템 종료" 문구가 출력된다.


    출처

    https://dev-coco.tistory.com/18?category=962739 

     

    728x90

    'Language > Java' 카테고리의 다른 글

    Java - 열거 타입(enum)  (0) 2022.11.29
    Java - Custom Exception  (0) 2022.09.29
    Java - Exception  (0) 2022.09.29
    Java - 추상 클래스 & 인터페이스  (0) 2022.09.21
    Java - final  (0) 2022.09.20

    댓글

Designed by Tistory.