컴퓨터공부/Kotlin & Java

자바 Exception, 예외처리, try/catch, 사용자 정의 예외클래스 생성

achivenKakao 2011. 11. 20. 16:17

35. 예외처리

 - 예외?
 : 프로그램이 실행중에 발생되는 사건
 : 자바에서는 Exception (익셉션) 이라고 한다.

 - 예외가 발생되면?
 : 프로그램이 '비정상 종료' 된다.
 : 일반 사용자는 어떤 문제로 프로그램이 비정상 종료되었는지를 모른다.
 (예외 관련된 정보를 제공하지만 일반 사용자는 잘 모른다 -> 영어/전문용어)

 - 예외처리?
 : 프로그램이 '비정상 종료' 되는 것을 '정상 종료'로 만들어 주는것
 : 'Exception handling' 이라고 한다
 : 일반 사용자가 어떤 문제로 프로그램을 중단하게 되었는지를 알려줄수 있다.
 (일반 사용자에게 영어 대신 한국어로, 전문용어 대신 일반 문장을 사용할수 있다)

 - 예외처리 방법 2가지

 1) try ~ catch  블럭

  try {
   
   // 실행코드
  
  } catch( XXXException e) {
  
   // 실행코드에서 예외 발생시 처리코드 (예외정보 출력하는 정도가 최고의 작업)

  }

 * 다중 catch 가능
  
  try {
   
   statement1;  // XXXException 발생 가능 코드
   statement2;  // YYYException  발생 가능 코드 
  
  } catch( XXXException e1) {
  
   // 실행코드에서 예외 발생시 처리코드 (예외정보 출력하는 정도가 최고의 작업)

  } catch(YYYException e2) {

   // 실행코드에서 예외 발생시 처리코드 (예외정보 출력하는 정도가 최고의 작업)

  } catch(Exception e3)

 ----> 계층구조의 하위부터 catch 한다.


 * finally 문

  : 반드시 수행되어야 하는 문장을 사용할때
    예외가 처리되거나 되지 않거나 상관없이 항상 실행되기를 원하는 코드를 포함하고 있다.
    일반적으로 파일을 닫거나 자원을 회수하려는 등의 마무리에 사용한다.

 


  ex)  try {
   
   statement1;  // XXXException 발생 가능 코드
  
  } catch( XXXException e1) {
  
   // 실행코드에서 예외 발생시 처리코드 (예외정보 출력하는 정도가 최고의 작업)

  } finally {
   
   //예외발생유무에 상관없이 반드시 수행되는 문장
   // 일반적으로 자원 반납하는 작업 (IO, DB, )
  }


 2) throws 키워드 이용

  : 메소드 선언시 사용
 
 ex) public void a() throws XXXException, YYYException {  }

  : 개념
  ----> 예외발생한 곳에서 예외처리를 하지 않고, 메소드를 호출한 곳으로 예외를 떠넘기는 방법
 
 ex)

 main() {
  try {

   a();
  
  } catch (xx e) {
  
  }
 }

 a() throws ArithmeticException {

  b();

 }

 b() throws ArithmeticException {

  int num = 3/0;

 }
  

 : 용도

  ----> 사용자 정의 예외클래스를 사용하기 위해서
  ----> 분산환경 예외처리를 하기 위해서

 ----> API 의 Exception 클래스를 이용

 * Exception 의 계층구조
      
       Throwable
        |
       Exception
        |
    
  IOException RuntimeException  SQLException
   |     |      |
 XXXException  NullPointerException 
 ...     ArithmeticException
      IndexOutofBoundsException
      ...

   
36. 사용자 정의 예외클래스 생성

 - 방법

 1) Exception 클래스를 상속받는 클래스 작성
 
 2) 문자열 하나 저장하는 생성자 작성

 ex)
 public class MyException extends Exception{
  public Myexception( String mesg ){
   super( mesg );
     }
  }

  - 이유?
  : API 예외 클래스는 표준 예외클래스
  : 모든 어플리케이션의 예외처리를 API 예외 클래스가 담당 하는 것은 불가

  : 각 어플리케이션에 적합한 예외클래스를 만들어서 처리한다.

 ex)
  데이터 검색했는데... 데이터가 없다..  ->  '예외' 라고 가정
             -> RecordNotFoundException (사용자 정의)

[출처] 자바 Exception, 예외처리 사용자 정의 예외클래스 생성|작성자 적이되고싶은가
출처 : http://blog.naver.com/x_tough_x?Redirect=Log&logNo=140020526763 
+
 



+

 

예외발생 예제

01 package com.base;
02  
03 public class Exception1 {
04     public static void main(String[] args) {
05         int[] var = {10,200,30};
06          
07         //존재하지 않은 배열의 인덱스를 호출하게 해서
08         //Exception을 발생시키는 예제
09         for(int i=0; i<=3; i++){
10             System.out.println("var["+i+"] : "+var[i]);
11         }
12         System.out.println("프로그램 끝!");
13     }
14 }

<< 출력결과 >>

var[0] : 10

var[1] : 200

var[2] : 30

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

       at com.base.Exception1.main(Exception1.java:10)



기본적인 try/catch 구문처리순서

01 package com.base;
02  
03 public class ExceptionEx2 {
04     public static void main(String[] args) {
05         System.out.println("==정상수행==");
06         System.out.println("1");
07         try{
08             System.out.println("2");
09              
10             //0으로 나누면 예외발생
11             System.out.println(5/0);
12              
13             System.out.println("3");
14         }catch(Exception e){
15             System.out.println("4");
16         }
17         System.out.println("5");
18     }
19 }

<< 결과값 >>

==정상수행==

1

2

4

5

 


특정한 예외 검출하기

01 package com.base;
02  
03 public class ExceptionEx3 {
04     public static void main(String[] args) {
05         int[] var = {10,200,30};
06          
07         for(int i=0; i<=3; i++){
08             try{
09                 System.out.println("var["+i+"] : "+var[i]);
10             }catch(ArrayIndexOutOfBoundsException ae){
11                 //예외발생시 생성된 예외객체가 가지고 있는
12                 //예외정보(예외문구)를 출력
13                 ae.printStackTrace();   //프로그램에 저장후 불러오는 것이므로
14                                         //처리순서에 차이가 발생할 수 있다.
15                  
16                 //System.out.println("배열을 넘엇습니다.");
17             }
18         }//for문의 끝
19          
20         System.out.println("프로그램 끝!");
21     }
22 }

<< 결과값 >>

var[0] : 10

var[1] : 200

var[2] : 30

프로그램 !

java.lang.ArrayIndexOutOfBoundsException: 3

       at com.base.ExceptionEx3.main(ExceptionEx3.java:9)

 


다중 catch문 사용하기

01 package com.base;
02  
03 public class ExceptionEx4 {
04     public static void main(String[] args) {
05         int var = 50;
06         try{
07             int data = Integer.parseInt(args[0]);
08  
09             System.out.println(var/data);
10             System.out.println("----------");
11         }catch(NumberFormatException e){
12             System.out.println("숫자가 아닙니다.");
13         }catch(ArrayIndexOutOfBoundsException e){
14             System.out.println("입력한 데이터가 없습니다.");
15         }catch(ArithmeticException e){
16             System.out.println("0으로 나눌순 없죠?");
17         }catch(Exception e){
18             System.out.println("나머지 예외는 내가 처리~~");
19         }
20         System.out.println("프로그램 종료!");
21     }
22 }



출처 : http://jjup77.blog.me/50110267744