java week 9


목차

1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

2. 자바가 제공하는 예외 계층 구조

3. Exception과 Error의 차이는?

4. RuntimeException과 RE가 아닌 것의 차이는?

5. 커스텀한 예외 만드는 방법


자바에서 예외 처리 방법


자바의 예외 처리는 예외가 발생한 메서드 내에서 직접 처리하는 방법과 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법, 그리고 사용자 정의 예외를 생성하여 처리하는 방법이 있다.

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

try{
    예외 발생 가능성이 있는 문장들;
}
catch(예외 타입1 매개변수명){
    예외타입1의 예외가 발생할 경우 처리 문장들;
}
catch(예외 타입 n 매개변수명){
    예외타입 n의 예외가 발생할 경우 처리 문장들;
}
finally{
    항상 수행할 필요가 있는 문장들;
}

try : 예외가 발생할 가능성이 있는 범위를 지정한 블록, 반드시 한 개 이상의 catch블록이 필요하며, catch블록은 try블록 뒤에 위치한다.

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

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

finally : 필수 블록은 아니다. try 블록과 catch 블록과 상관없이 일관되게 무조건 실행된다. 보통 db나 파일을 닫을 때 많이 사용한다.

public class ExceptionTest {

    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("배열 참조 에러 발생");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }finally{
            System.out.println("시스템 종료.");
        }
    }
}

그림1

  • tring[2] 배열을 선언하고, 3번째 배열에 값을 대입할 때, 예외가 발생한다.

  • ArrayIndexOutOfBoundsException 이 발생하여 catch에 잡히고 “배열 참조 에러 발생” 이라는 메시지가 출력된다.

  • 최종적으로 finally가 실행되며 “시스템 종료.” 메시지가 출력된다.

2. 예외(Exception)이 발생한 메소드를 호출 한 곳으로 예외 객체를 넘기는 방법 (throws)

예외가 발생한 메소드를 호출한 지점으로 예외를 전달하여 처리한다.

public class ExceptionTest {

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

그림2

  • main 함수에서 callDriver() 함수를 실행

  • callDriver() 함수에서는 “oracle.jdbc.driver.OracleDriver” 클래스를 가져온다.

  • 해당 클래스를 찾지 못하면 ClassNotFoundException이 발생하는데, callDriver()에서는 throws ClassNotFoundException 처리로 호출한 main 함수로 예외를 넘긴다.

  • main에서는 ClassNotFoundException을 받아 catch 문에서 잡아서 “클래스를 찾을 수 없습니다.” 메시지를 출력한다.

  • 마지막으로 finally가 실행되며 “시스템 종료” 를 출력한다.

3.사용자 정의 예외 생성 (throw)

1번과 2번은 기존에 존재한 예외를 통하여 처리하였다. 사용자는 사용자만의 예외 클래스를 작성하여 예외를 발생하고 처리할 수 있다.

이 때 클래스를 구현할 때는 예외 클래스의 최상위인 Exception class를 상속받아 구현한다.

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

자바 가상머신은 프로그램 실행도중 예외가 발생되면 자동으로 해당하는 예외 객체를 발생시키고 catch 블록을 실행한다. 추가적으로 사용자가 강제적으로 발생시킬 수 있는데 이때는 예약어 throw를 사용한다.

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

public class ExceptionTest {

    static void callException() throws MyException{
       
        throw new MyException();
    }
   
    public static void main(String args[]){
       
        try{
               callException();
       
              }catch(MyException e){
                      System.out.println(e.getMessage());
               }catch(Exception e){
                       System.out.println(e.getMessage());
               }finally{
                     System.out.println("시스템 종료.");
              }    
    }
}

그림3

  • MyException 이라는 Exception을 상속한 예외를 만들었다. 그리고 MyException은 “내가 만든 예외” 라는 메시지를 갖는다.

  • ExceptionTest의 main 함수가 실행되면 callException() 함수를 호출한다.

  • callException 함수는 MyException()을 new로 생성한 후 callException() 함수를 호출한 main 함수로 던진다.

  • MyException을 받은 main 함수는 catch에서 해당 예외를 받아서, 예외의 메시지를 출력한다. “내가 만든 예외”

  • 최종적으로 finally가 실행되어 “시스템 종료”가 출력된다.

    자바가 제공하는 예외 계층 구조


    그림4

  • 문법 에러 : 문법적인 에러, 컴파일시 대부분 수정가능
  • 실행 에러 : 컴파일은 수행이 되나 실행 시에 문제가 되는 경우

    • 논리 에러 : 프로그래머가 코드를 잘못 작성해서 생기는 경우
    • 시스템 에러 : 프로그래머의 의지와는 상관없이 발생하는 것이므로 보통 프로그래머가 처리할 수 있는 방법은 없다.
    • 예외 사항 : 정상적으로 프로그램이 동작중에 발생할 수 있는 여러가지 사항들, 자바는 이러한 예외사항들을 처리를 지원하고 있다.

자바에서는 발생할 수 있는 모든 오류(Exception과 error)를 클래스로 정의하였다.

그림5

모든 예외클래스는 Throwable 클래스를 상속받고 있으며, Throwable은 최상위 클래스 Object의 자식 클래스이다.

Exception은 수많은 자식클래스를 가지고 있다. 그 중 runtimeException은 CheckedException과 UncheckedException을 구분하는 기준이 된다.

RuntimeException을 제외한 모든 클래스는 CheckedException이며

RuntimeException과 그의 자식 클래스들을 Unchecked Exception이라 부른다.


Exception과 Error의 차이는?


Error

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는 것

시스템 레벨에서 발생한다.

(시스템 레벨이기에 프로세스에 심각한 문제를 야기함)

ex) OutOfMemoryError StackOverflowError

Exception(예외)

사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생되는 프로그램 오류

예외가 발생하면 프로그램이 종료되는 것은 에러와 동일하다. 하지만 try~catch 구문을 통하여 예외를 처리해준다면 종료없이 프로그램을 정상적으로 작동할 수 있게 할 수 있다.

개발자가 구현한 로직에서 발생한다.

예외는 발생할 상황을 미리 예측하여 처리할 수 있다.


RuntimeException과 RE가 아닌 것의 차이는?


그림6

Checked Exception

  • 반드시 예외를 처리해야한다.

  • 컴파일 단계에서 명확하게 exception체크가 가능하다.

Unchecked Exception

  • 반드시 예외를 처리할 필요가 없다.

  • 개발자가 부주의해서 발생하는 경우가 대부분이고, 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문이다.

  • 컴파일 단계에서 확인하지 못한다면 unchcked exception이 된다.

    커스텀한 예외 만드는 방법


커스텀할 예외의 특징에 따라 Exception 또는 RuntimeException을 상속 받아 제작한다.

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

커스텀 예외를 만들어 사용한다는 것은 표준에 비해 좀 더 명확한 정보를 줄 수 있지만 남발한다면 많은 클래스가 만들어져 메모리낭비와 클래스 로딩 시 많은 시간이 걸린다.


출처 —

  1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) https://hyeonstorage.tistory.com/203 [개발이 하고 싶어요]
  2. 자바가 제공하는 예외 계층 구조 https://finewoo.tistory.com/22
  3. Exception과 Error의 차이는? https://java119.tistory.com/44 https://www.nextree.co.kr/p3239/
  4. RuntimeException과 RE가 아닌 것의 차이는? https://java119.tistory.com/44 https://www.nextree.co.kr/p3239/
  5. 커스텀한 예외 만드는 방법 https://lob-dev.tistory.com/entry/Live-StudyWeek-09-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC





© 2019.04. by salmon2

Powered by theorydb