ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java | 예외 처리 try~catch~finally
    JAVA/JAVA 2020. 2. 5. 17:45

    Exception 예외 처리

    예외가 발생했을 때 자바 프로그램이 정상적으로 실행되도록 예외를 처리하는 것


    try~catch~finally

    예외가 발생했을 때 예외를 어떻게 처리할 것인가를 결정하는 구문


    형식

    try {
        // 예외 발생 가능성이 있는 코드
    } catch([예외 처리 클래스명] [예외 처리 객체명]) {
        // 예외 처리, 보통 예외 메세지 출력
    } finally {
        // 예외 발생과 상관없이 반드시 처리해야하는 코드
        // ex) DB 연동 해제, 메모리 해제 구문
    }

    catch문은 여러 개 작성 가능


    | 파이프 기호

    catch()문에서 2개의 에러를 처리할 때 사용하는 기호


    형식

    catch([예외 처리 클래스명] | [예외 처리 클래스명] [예외 처리 객체명])
    
    // catch(ArithmeticException | NumberFormatException e) 

    Exception Class

    각각의 예외 클래스들을 포함하는 상위 클래스

    • 예외가 하나인 경우에 Exception 클래스명만으로도 작성 가능
    • Exception 클래스가 상위 클래스이기 때문에 그 외의 예외들은 자동 형 변환되어 인자로 전달 가능
    • 복수의 catch문이 있는 경우 가장 마지막에 작성해야 함

    Throwable Class Method

    Catch 구문에서 자주 사용되는 Throwable 클래스 메소드
    주로 예외에 대한 정보 메세지 출력

    메소드 설명
    getMessage() Throwable 클래스 일반 메소드, 객체명.getMessage()로 사용
    가장 간단한 에러 메세지, 발생한 예외 내용만 출력
    toString() Throwable 클래스 일반 메소드, 객체명.toString()으로 사용
    권장되는 방법, 발생한 예외 종류 출력
    toString()을 생략하고 객체명으로만 출력해도 동일한 결과가 나옴
    printStackTrace() Throwable 클래스 일반 메소드, 객체명.printStackTrace()로 사용
    발생한 예외의 종류와 문제가 있는 코드의 라인 출력
    출력 코드 없이 단독으로 사용

    예제

    package j200205;
    
    public class ExceptionTotal {
    
        // 매개변수를 Run Configurations에서 설정
        public static void main(String[] args) {
        
            try {    // 에러 발생 가능성이 있는 코드 작성
                int a = Integer.parseInt(args[0]);
                int b = Integer.parseInt(args[1]);
                System.out.println("a: " + a + ", b:" + b);
                System.out.println("a를 b로 나눈 몫: " + (a / b));
    
               // 수식 예외 처리
            } catch (ArithmeticException e) {
                System.out.println(e.getMessage());
             // a = 9, b = 0
             // / by zero
    
             // 배열 첨자 예외 처리
            } catch (IndexOutOfBoundsException e) {
                System.out.println(e);
             // a = 9
             // java.lang.ArrayIndexOutOfBoundsException: 1
    
             // 숫자 변환 실패 예외 처리   
            } catch (NumberFormatException e) {
                System.out.println(e.toString());
             // a = 9, b = c
             // java.lang.NumberFormatException: For input string: "c"
    
             // 모든 종류의 예외 처리 가능
            } catch (Exception e) {    
                e.printStackTrace();
             // a = 9, b = c
             /*
             바로 위의 catch문이 없는 경우
             java.lang.NumberFormatException: For input string: "c"
             at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
             at java.lang.Integer.parseInt(Integer.java:580)
             at java.lang.Integer.parseInt(Integer.java:615)
             at j200205.ExceptionTotal.main(ExceptionTotal.java:9)
             */ 
    
             // 예외 발생과 상관 없이 반드시 실행
            } finally { 
                System.out.println("예외 발생과 상관 없이 반드시 실행");
            }
        }
    
    }
    

    예외가 발생했을 때 이를 처리할 수 있는 구문인 try~catch~finally문에 대해 알아보았습니다.

    catch 구문에서는 예외 자체를 해결한다기보다 예외의 정보를 얻어내고,

    예외는 실제로 예외가 발생한 곳에서 해결된다고 보면 조금 더 이해하기가 쉬운 것 같습니다.

     

    댓글

Designed by Tistory.