본문 바로가기
Java/Java 이론 정리

[Java] 예외처리

by ProSeraphina 2020. 7. 20.

예외 처리: 에러 발생시 어떻게 처리할 것인가?

   정의: 사전에 예상되는 에러에 대비하는 코드를 작성하는 것

   목적: 비정상 종료의 방지를 통한 정상 실행상태 유지→견고한 프로그램

 

에러 종류

1)수정 불가능한 에러(Error): 프로그래머가 소스상에서 수정할 수 없는 에러 (ex. 메모리 부족, 이클립스 에러)

  →처리 불가(재부팅, 주석 처리)

2)수정가능 에러(Exception): 가벼운 에러(ex. ID 중복체크, 파일 입출력(경로명), 서버(IP), 오라클(오라클 주소, SQL) 등) 

  →예외처리 가능. 이제부터 말하는 예외처리상 에러는 2)를 의미함.

 

1)컴파일 에러: 컴파일시 에러(문법상의 에러)

2)실행시 에러: 실행시 발생(사용자 입력 오류)

3)논리적 에러: 실행은 되지만 동작이 다르게(프로그램의 순서가 틀린 경우)

 

예외처리 계층구조

:상위구조일수록 catch절 중 나중에 써야함(∵순차적으로 처리하기 때문)

             Object(최상위 클래스)

                               │

                  Throwable

┌──┴─┐

Error                               Exception 

                      ┌──┴─┐

          CheckedException                    RuntimeException(실행시 에러: 생략가능)

                                                                                   

                                                        RuntimeException 하위 예외

 

CheckException: 반드시 예외처리 필요 UncheckException: 생략 가능,
필요한 경우에만 예외처리

사용자 실수 등 외적 요인에 의해 발생 
컴파일 단계에서 확인
    - 파일 입출력, 메모리 입출력, 네트워크 입출력
      데이터베이스 연결 
      쓰레드 충돌

프로그래머의 실수로 발생하는 예외(Runtime Exception)
실행단계에서 확인
 - ex. 사용자 입력: 문자열→정수변환
                         나누기0으로 나눔

 IOException(입출력)
 InterruptedException(쓰레드)
 MalformedURLExeption(URL)
 SQLException(DB)
 ClassFoundException(클래스 이름 잘못 기재)
 DataFormatException 등
 
 RuntimeException 하위 예외
 - ArithmeticException(산술연산 오류)
 - NullPointerException(클래스 저장 안됐을 때)
 - ArrayIndexOutOfBoundsException(배열 범위 오류)
 - NumberFormatException(정수 변환시)
 - ClassCastException(형변환 오류시)
 - IllegalArgumentException
 - IndexOutOfBoundException
 - SystemException 등

 

예외처리 방법

예외처리
종류
try~catch(~finally)
(
예외 복구)
throws
(
예외 회피)
임의발생
(throw)
사용자 정의
(throw, extends Exception)
용도 프로그래머가 예외발생 시
직접 처리
목적: 디버깅(에러확인→소스변경)
간접 처리(시스템 내 처리)

테스트용 라이브러리에서 지원 X
예시   try{ //실행할 코드
    int[] arr=new int [2];
    arr[0]=문자열→정수
    arr[2]=문자열→정수
    int res=arr[0]/arr[1];
    System.out.println(res);
  } //에러 발생시 처리
  catch(정수입력 안된경우){}
  catch(배열범위 초과한 경우){}
  catch(0으로 나눈 경우){}
  finally{} 무조건 수행하는 문장
  (: 생략 가능.
     단, 네트워크/DB 프로그램           에는 서버 연결해제를 위해           반드시 존재 →디도스)
 - 에러 예측을 가능하게 해서 프로그래머가 각자 프로그램에 맞게 예외처리하도록 유도
 →API(Java, 라이브러리)

형식)
메소드() throws 예측한 예외클래스 등록(여러개일 경우 콤마로 구분, 순서상관X)
 public void display() throws Exception, ArrayIndexOutOfBoundsException{
 }

예외처리는 호출하는 메소드에서 처리
   

***try~catch의 부분처리(for문 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.sist.exception;
//부분처리
public class MainClass{
 
    public static void main(String[] args){
        try{
            for(int i=1; i<=10; i++){
                try{
                    System.out.println("i="+i);
                    int a=i/(int)(Math.random()*3);
                    System.out.println("a="+a);
                } catch(Exception e){
                    System.out.println("for문 i++로 이동");
                }
            }
        } catch(Exception ex){
ex.printStackTrace();
            System.out.println(ex.getMessage());
        }
        System.out.println("프로그램 정상 종료");
    }
}
cs

- 예외 발생시 예외와 일치하는 catch블럭을 찾음

  →찾게되면 catch블럭 내 문장 수행하고 try~catch문을 빠져나가 다음 문장 수행

  →못찾으면 예외처리 실패

- 예외 발생하지 않으면 try블럭 내 문장 수행 후 try~catch문을 빠져나가 다음 문장 수행

 

- catch절 예외메세지 코드

  printStackTrace() : 예외가 발생한 line 번호 출력

  getMessage(): 예외가 발생한 이유를 알려줌.

     ex) 숫자를 0으로 나눈경우 => /zero

 

***catch절이 많을 경우: 같은 계층을 |(or)로 묶거나 상위 개념으로 한꺼번에 처리 가능(멀티 catch블럭)

    ex1. catch(ArithemeticException | ArrayIndexOutOfBoundsException e){}

    ex2. catch(exception e){}

 

***예외처리 생략이 가능(조건문으로 주로 처리), 특수한 경우(조건문 처리 어려운 경우) 예외처리 사용

    int a=10;
    int b=0; 

    if(b==0)

     System.out.println("0으로 나눌 수 없다")

   else

     System.out.println(a/b)


호환가능

  try{

     int a=10;

     int b=0; 

     System.out.println(a/b);

     } catch(Exception ex){

       System.out.println("0으로 나눌 수 없다");

     }

끝.

 

댓글