본문 바로가기

개발공부/JAVA

자바스터디 9주차 feat.백기선님 (예외처리)

예외란~

exception 종류 발생 경우
ArithmeticException 정수를 0으로 나눌때 발생
NullPointerException null 레퍼런스를 참조할 때 발생
ClassCastException 변환할 수 없는 타입으로 객체를 변환할때 발생
OutOfMemoryException 메모리가 부족한 경우 발생
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 접근시 발생
IllegalArgumentException 잘못된 인자 전달 시 발생
IOException 입출력 동작 실패 또는 인터럽트 시 발생
NumberFormatException 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생 

 

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

1. try-catch-finally 문

 

try{

예외가 발생할 가능성이 있는 문장

}catch(Exception1 e1){

Exception1이 발생했을 경우, 이를 처리하기 위한 문장

}catch(Exception2 e2){

Exception2가 발생했을 경우, 이를 처리하기 위한 문장

}finally{

예외의 발생여부에 관계 없이 항상 수행되어야하는 문장

(try블럭에서 return문이 실행되는 경우에도 finally 문장들이 먼저 실행 된 후에 현재 실행중인 메서드를 종료한다.)

}

* catch 블럭의 괄호 내에 선언된 변수는 catch블럭내에서만 유효하다

 

흐름

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

1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.

2. 일치하는 catch블럭을 찾게되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면 예외는 처리되지 못한다.

3. finally문장 실행

 

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

1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

2. finally문장 실행

 

2. 키워드 throw : 예외 발생시키기

 

1. 먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 후

2. 키워드 throw를 이용하여 예외를 발생시킨다.

 

class Exception{
	public static void main(String args[]){
    	try{
        	Exception e = new Exception("고의로 발생시킴");
            throw e; // 예외로 발생시킴
        }catch(Exception e){
        System.out.println(e.getMessage());
        // 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다
            e.printStackTrace(); 
            //예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외메세지를 화면에 출력한다
        }
        System.out.println("프로그램이 정상 종료되었음");
    }
}

3. throws : 메서드에 예외 선언하기

메서드 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어주기만 하면된다.

예외가 여러 개일 경우에는 쉼표(,)로 구분한다.

throws에 명시하는 것은 예외를 처리하는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 맡기는 것이다. 결국 어느 한 곳에서는 반드시 try-catch문으로 예외처리를 해주어야한다.

=> 메서드에 호출시 넘겨받아야 할 값을 다시 받아야하는 경우(메서드 내에서 자체적으로 해결이 안되는 경우)에 예외를 메서드에 선언해서 호출한 메서드에서 처리해야한다.

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

 

  • 자바가 제공하는 예외 계층 구조
  • Exception과 Error의 차이는?

실행시(Runtime시) 발생할 수 있는 프로그램 오류

1. error

: 메모리부족, 스택 오버 플로우와 같은, 발생하면 복구할 수 없는 심각한 오류

2. exception

: 예외는 발생되더라도 수습은 가능 

: 프로그래머가 이에 적절한 코드를 미리 작성해놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.

 

  • RuntimeException과 RE가 아닌 것의 차이는?

: 프로그램 실행 중에 발생하는 오류 : RuntimeException

: 프로그래밍 언어의 문법에 맞지 않게 프로그램을 작성하는 오류(실행전) : Compile time error

 

  • 커스텀한 예외 만드는 방법 (?: 다시확인)

기존에 정의된 예외 클래스 외에 프로그래머가 새로운 예외 클래스를 정의하고 싶다면?

class MyException extends Exception{
	MyException(String msg){ //문자열을 매개변수로 받는 생성자
    	super(msg); //조상인 Exception클래스의 생성자를 호출한다.
    }
}

github.com/whiteship/live-study/issues/9

 

9주차 과제: 예외 처리 · Issue #9 · whiteship/live-study

목표 자바의 예외 처리에 대해 학습하세요. 학습할 것 (필수) 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 자바가 제공하는 예외 계층 구조 Exception과 Error의 차이는? RuntimeException과 RE가

github.com


출처 : 자바의 정석