ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Chapter 10.2 예외 처리
    Java 2023. 5. 10. 11:34

     

     

    예외 처리의 개요

    프로그램에서 예외가 발생하는 경우 프로그램은 종료됩니다.  예외가 발생했을 경우 프로그램이 갑자기 종료된다면 소비자가 서비스를 제대로 사용할 수 없습니다.  따라서 예외가 발생하더라도 정상 실행을 이어가기 위해서 우리는 예외 처리를 해야합니다.

    예외 처리에는 Checked Exception과 Unchecked Exception로 2가지 종류가 있습니다.  Checked Exception은 자바 컴파일러가 소스 파일을 컴파일할 때 예외가 발생할 가능성을 발견한다면 개발자에게 예외 처리 코드를 작성할 것을 요구합니다. 예외 처리를 발견했을 경우 Unhandled exception 에러가 발생합니다.  그러나 Unchecked Exception은 컴파일러가 체크해주지 않기 때문에 개발자 재량으로 예외 처리를 합니다.  Unchecked Exception을 강제해서 코드를 작성하지 않는 이유는 사소한 개발자 실수도 하나하나 예외 처리 코드를 작성한다면 코드가 길어지고 복잡해지기 때문입니다.

     

     

    예외 처리 코드

    예외 처리 코드를 쓰는 방법은 try-catch-finally 블록을 생성자 내부와 메소드 내부에 작성합니다.

    try {
    
    	// 예외 발생이 가능한 코드를 작성합니다.
    
    } catch(예외클래스 e) {
    
    	// 예외 처리
        
    } finally {
    	
        // 항상 실행
      
    }

     

    • try 블록에서 예외 발생이 없다면, catch 코드 블록이 실행되지 않고 finally 코드 블록이 실행됩니다.
    • try 블록에서 예외가 발생한다면, 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행합니다.  그리고 finally 코드 블록을 실행합니다.
    • finally 블록은 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 작성합니다. return 문이 있더라도 실행됩니다.

     

     

    예외 종류에 따른 처리 코드

    다중 catch

    코드에는 여러가지 예외가 발생하는 경우에는 다중 catch 블록을 사용합니다.  여기서 catch 블록이 여러 개라도 하나의 catch 블록만 실행할 수 있습니다.  try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동합니다.

    try {
    	
        // ArrayIndexOutOfBoundsException 발생
        
        // NumberFormatException 발생
      
    } catch(ArrayIndexOutOfBoundsException e) {
    	
        // 예외 처리1
    
    } catch(NumberFormatException e) {
    
    	// 예외 처리 2
       
    }

     

    catch 순서

    다중 catch 블록을 작성할 때, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 합니다.  try 블록에서 예외가 발생했을 경우 catch 블록이 순차적으로 실행됩니다.  이때 상위 예외 클래스의 catch 블록이 위에 있다면 하위 예외 클래스의 catch 블록이 실행되지 않기 때문에 더 작은 범위인 예외 클래스를 먼저 배치합니다.

    try {
    
    	// ArrayIndexOutOfBoundsException 발생
        
        // 다른 Exception 발생
       
    } catch(ArrayIndexOutOfBoundsException e) {
    	
        // 예외 처리 1
        
    } catch(Exception e) {
    
    	// 예외 처리 2
        
    }

     

     

    예외 떠넘기기

    예외 처리를 할 때, 필요한 경우에는 메소드를 호출한 곳으로 예외를 떠넘길 수 있습니다.  throws 키워드를 통해 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 넘기는 역할을 합니다.

     

    throws 키워드 사용하기

    리턴 타입 메소드이름(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
    
    // ...
    
    }
    
    리턴 타입 메소드이름(매개변수, ...) throws Exception {
    
    // ...
    
    }

     

    throws를 사용하는 방법

    public void method1() {
    	try {
        	method2();
        } catch(ClassNotFoundException e) {
        // 예외 처리 코드
        System.out.println("클래스가 존재하지 않습니다.");
        }
    }
    
    public void method2() throws ClassNotFoundException {
    	Class clazz = Class.forname("java.lang.String2");
    }

     

     

    * main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데 프로그램이 알 수 없는 예외 내용을 출력되기 때문에 사용하지 않습니다.

     

     

    출처 | 혼자 공부하는 자바

Designed by Tistory.