본문 바로가기

Study/Java Study

11장. 예외 처리

1. 예외 처리

▷ 예외

: 프로그램의 정상적인 흐름을 방해하는 원치 않는 이벤트

 

예외 처리 

: 애플리케이션의 정상적인 흐름을 유지할 수 있도록 런타임 오류를 처리하는 강력한 방법 중 하나

 


 

2. 예외의 유형과 클래스

 

예외의 유형

   -   컴파일 예외 : 컴파일러가 컴파일 시간에 확인하는 검사형 예외

             -> 메서드 내부에 확인된 예외가 있는 경우 메서드는 예외를 처리하거나 throw 키워드를 통해 예외 처리

 

 

   -  런타임 예외 : 런타임에 발생하는 비검사형 예외

             -> 예외를 처리할 지 말지는 전적으로 프로그래머에게 달려 있음

 

예외 클래스

  - 예외의 모든 유형은 Throwable 클래스의 하위 클래스

  - 예외 클래스는 프로그램이 오류가 발생하기 전에 잡아내야 하는 예외적인 조건을 위한 클래스이므로 사용자별 예외 클      래스를 생성하도록 확장됨

예외 클래스의 계층 구조


 

3. 예외 처리 방법

 

키워드 설명
try 예외 코드를 배치할 블록을 지정하기 위해 사용
단독으로 X -> catch 나 finally가 뒤따라야함
catch 단독으로 X -> try 나 finally가 뒤따라야함
finally 프로그램에서 꼭 필요한 코드를 실행하는데 사용
예외 처리 여부에 관계 없이 실행
throw 예외를 고의로 발생
throws 자신을 호출한 상위 메서드로 오류를 던지는 역할
  • try ~ catch문

: 프로그램 실행 중 예외를 일으킬 수 있는 코드를 try 로 묶고 catch 로 예외를 처리 

  try 블록 다음에 catch 블록을 사용

 

try {
 // try 블록의 명령문 
}

catch(예외클래스 e) {
 // catch 블록의 명령문: 예외 처리         <- try 블록에서 예외 발생 시 실행
}

 

예제) 0으로 나누는 잘못된 연산으로 예외가 발생했을 때의 try~catch 문의 예외 클래스 AtrithmeticException으로 처리

public class Example01 {
  public static void main(String[]args) {
    try {
      int a = 0;
      int b = 5/a;
    }
    
    catch(ArithmeticException e) {
      System.out.println("0으로 나눕니다.");
    }
    System.out.println("try~catch문의 외부 문장입니다.");
  }
}

 

실행 결과)

0으로 나눕니다.
try~catcatch문의 외부 문장입니다.
  • 다중 catch문

: 예외의 유형이 확실하지 않을 때 try 블록 다음에 여러 개의 catch 블록을 작성

 

 

예제) 다중 catch문의 사용 예시

 

public class Example02 {
  public static void main(String[] args) {
  
    try {
      Integer in = new Integer("abc");
      in.intValue();
    }
    catch(ArithmeticException e) {
      System.out.println("예외 발생 ArithmeticException " + e);
    }
    catch(NumberFormatException e) {
      System.out.println("예외 발생 NumberFormatException " + e);
    }
    System.out.println("try~catch문의 외부 문장입니다.");
  }
}

 

실행 결과 ) 

예외 발생 NumberFormatException java.lang.NumberFormatException:
For input string: "abc"
try~catch문의 외부 문장입니다. 
  • try ~ catch ~ finally 문

: finally 블록은 예외 발생 여부에 관계없이 실행 ( try~catch문이 실행된 후 실행)

 

try {
 // try 블록의 명령문
}

catch (Exception e) {
 // catch 블록의 명령문
}

finally {
 // finally 블록의 명령문
}

 

예제)

public class Exception03 {
  public static void main(String[] args) {
    int[] arr = {10, 20, 30};
    
    try {
      for(int i = 0; i <= 3; i++) {
        System.out.println("arr[" + i + "] : " + arr[i]);
      }
    }
    catch(Exception ex) {
      System.out.println("예외 처리입니다....");
      System.out.println(ex.getMessage());
    }
    finally {
      System.out.println("예외 발생 여부와 상관없이 실행됩니다.");
    }
  }
}

 

실행 결과)

arr[0] : 10
arr[1] : 20
arr[2] : 30
예외 처리입니다....
Index 3 out of bounds for length 3
예외 발생 여부와 상관없이 실행됩니다.

 

  • throws 키워드

: 프로그램 실행 중 메서드가 예외를 발생시킬 수 있도록 함

  예외가 발생했을 때 발생한 메서드에서 직접 처리하지 않고 자신을 호출한 곳으로 떠넘기도록 함

 

메서드유형 메서드명(매개변수목록) throws 예외처리목록 {
   // 구현 코드 
}

 

예제)  throws, throw  키워드를 사용하여 예외 처리

 

import java.util.Scanner;

public class Exception04 {
  static void check(int num) throws NumberFormatException {
    if (num < 0)
       throw new NumberFormatException("0보다 작습니다.");
    else 
       System.out.println(num);
  }
  
public static void main(String[] args) {
  Scanner s = new Scanner(System.in);
  System.out.println("숫자를 입력하세요.");
  int num = s.nextInt();
  
  try {
    if (num < 0)
      throw new NumberFormatException("0보다 작습니다.");
    else
      System.out.println(num);
      
    check(num);
  } catch(NumberFormatException e) {
      System.out.println("예외 발생 " + e);
  }
 }
}

 

실행 결과) 

숫자를 입력하세요.
-1
예외 발생 java.lang.NumberFormatException: 0보다 작습니다. 

 

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

JAVA 프로그래밍 및 실습 [중간 정리 요약본]  (0) 2023.10.21
12장. 파일 입출력  (0) 2023.05.28
10장. 패키지  (0) 2023.05.28
9장. 추상 클래스와 인터페이스  (0) 2023.05.22
8장. 상속과 다형성  (1) 2023.05.21