본문 바로가기

Kosta 교육

[Day12] chap8. 예외처리

1.1 프로그램 오류

컴파일 에러(compile-time error) : 컴파일할 때 발생하는 에러

런타임 에러(runtime error) : 실행할 때 발생하는 에러

 

자바의 런타임 에러

에러(error) : 프로그램 코드에 의해 수습될 수 없는 심각한 오류

예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 >> 예외는 처리해야 함


1.2 예외처리의 정의와 목적

예외처리(exception handling)

: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성

: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지


1.3 예외처리 구문 try-catch문

public stsatic void main(String[] args){

    try{
    	try {		
        } catch(Exception e){
        		//...
        }
    } catch(Excepiton e){
    	try{
        }catch(Exceptione){ // 컴파일 에러 발생
        	//...
        }
    } // try-catch문 끝
} // main 메서드 끝

try 블럭 내에서 예외가 발생한 경우

1) 예외가 발생한 즉시 발생한 예외와 일치하는 catch 블럭이 있는지 확인(그 이후 try 블럭 내 문장을 실행하지 않음)

2) 일치하는 catch 블럭을 찾으면, 그 catch 블럭을 수행하고 전체 try-catch문을 빠져 나가 다음 문장을 계속해서 수행

2) 일치하는 블럭을 찾지 못하면 예외 처리 불가능 >> 에러 발생

 

try 블럭 내에서 예외가 발생하지 않는 경우

1) catch 블럭을 거치지 않고 전체 try-catch문을 빠져 나가 수행을 계속함

 

package day12;

public class ExceptionTest1 {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "hong";
        //System.out.println(str1.toString()); // NullPointerException 발생 >> null은 toString 즉, 문자열로 바꿀 문자 자체가 없음 (주소값을 가지고 있지 않음(
        System.out.println(str2.toString());
        int[] arr = new int[5];

        try{
            System.out.println(str1.toString()); // 에러 발생 >> catch문으로 이동 >> NullPoint 에러이므로 맞는 catch문으로 이동
            for(int i = 0; i<=arr.length; i++){ // 에러 발생 >> ArrayIndexOutOfBoundsException catch문으로 이동해야 함
                arr[i] = i*10;
            }
        }catch (NullPointerException e1){
            System.out.println(e1.getMessage()); // 어떤 에러인지 에러 메시지 출력
            //e.printStackTrace(); // 어디서 에러가 발새했는지 출력
        }catch(ArrayIndexOutOfBoundsException e2){
            System.out.println(e2.getMessage());
            //e.printStackTrace();
        }
        System.out.println("종료");

    }
}

1.4 예외 발생시키기

1) 연산자 new 를 이용해 발생하려는 예외 클래스의 객체를 만든 다음

2) 키워드 throw를 이용해서 예외를 발생

try{
	Exception e = new Exception("고의 발생");
    throw e; // 예외 발생
    
    throw new Exception("고의 발생"); // 선언과 동시에 예외를 던질 수 있음
}catch(Exception e){
	System.out.println("에러 메시지 : "+e.getMessage()); //발생한 에러 e에 대한 메시지 출력
    e.printStackTrace(); // 발생한 에러 e가 어디서 발생했는지 추적
}

1.5 예외 클래스 계층구조

RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외 (예외 처리 필수)

Exception 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 (예외 처리 선택) >> 예외의 최상위 클래스 Exception

 

- try문에서 예외가 발생했을 때 catch 블럭 중 Exception을 처리하는 catch 블럭은 반드시 마지막이어야 함

- 발생한 예외 객체를 catch 블럭 참조 변수로 접근 가능


1.6 finally 블럭

try{
	// 예외가 발생할 가능성이 있는 문장
} catch(Exception e1) {
	// 예외 처리를 위한 문장
} finally{
	// 예외 발생 여부 관계없이 항상 수행되어야 하는 문장
    // finally 블럭은 try-catch문 맨 마지막에 위치
}

- 예외 발생여부와 상관없이 실행되어야 하는 코드가 들어가며, 선택적으로 사용이 가능

- 예외 발생 시 try - catch - finally, 예외 미발생시 try-finally 순서로 실행

- try, catch 블럭에서 return문을 만나도 finally 블럭은 수행


1.7 메서드 예외 선언

void method() throws Exception1, Exception2, ... ExceptionN{
	// 메서드 내용
}

- 예외를 처리하는 또 다른 방법응로, 예외를 처리하는 것이 아니라 호출한 메서드로 전달

- 호출한 메서드에서 예외처리를 해야하는 경우에만 사용 가능

 

package day12;

import java.io.IOException;

public class ExceptionTest6 {
    static void method() throws IOException, Exception{
        boolean flag = false;
        if(flag){
            throw new IOException("입출력 예외");
        }else{
            throw new Exception("모든 예외");
        }

    }
    public static void main(String[] args) {
        try{
            method();
        }catch (IOException e){
            System.out.println(e.getMessage());
            //e.printStackTrace();
            //e.getMessage();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            //e.getMessage();
            //e.printStackTrace();
        }
    }
}

1.8 예외 되던지기

- 예외를 처리한 후 다시 예외를 생성해서 호출한 메서드로 전달할 수 있음

- 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 예외를 처리해야 하는 경우 사용


1.9 사용자정의 예외 만들기

- 기존의 예외 클래스를 상속받아 새로운 예외 클래스 정의가 가능함

- 에러 코드를 저장할 수 있도록 ERR_CODE와 getErrCode()를 멤버로 추가가 가능함

class MyException extends Exception{
	private final int ERR_CODE; // 에러 코드 값 저장을 위한 필드 추가
    
	MyException(String msg){ // 문자열을 매개변수로 받는 생성자
    	super(msg); // 조상인 Exception 클래스의 생성자 호출
    }
    
    public int getErrCode(){ // 이 메서드는 주로 getMessage()와 함께 사용함
    	return ERR_CODE; 
    }
}