20.03 ~ 20.08 국비교육/JAVA

예외 처리

찹키리 2020. 3. 30. 09:37

<예외 처리>

 

-정의
:실행 시 상황에 따라서 발생하는 오류(빨간줄 아님)
코딩 시 오타 등의 이유로 빨간줄이 생기는 현상은 예외가 아닌 단순한 오류 -> 직접 수정한다^^

 

컴파일까지는 오류가 없어야 한다. 실행시, 입력 인자에 따라 오류가 발생하는 것을 예외라고 한다.
ex. 메소드 실행 시 분모 값에 0을 넣은 경우, 인자를 안 준 경우, 데이터 형을 틀리게 넣는 경우 등

-> 예외 처리를 통해 이러한 문제를 해결한다.



-처리

 

try {
예외발생 예측지점
} catch(Exception e) {
e를 이용해서 예외처리
} finally(선택적 구문) {
마지막 처리문(주로 자원반납)
}

 

 

 

try {

} catch {

} catch {

} catch {

 

}

 

-> 여러가지 예외 발생 예측 

하나의 try 블록 안에 catch가 여러 개 존재하는 경우:
1)상황에 따라 예외처리를 달리하고자 할 때 catch를 여러 개 사용한다.

 

2)범위가 좁은 범위에서 넓은 범위로 나아가야 한다.★

-> 한 번 놓치면 그 다음 catch가 잡고, 놓치면 그 다음 catch가 잡고, ... 어디선가는 오류가 잡혀야 한다.

 

 

<예제1>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class EX1 {
    public static void main(String args[]) {
        System.out.println("매개변수로 받은 두 개의 값");
 
    int a = Integer.parsInt(args[0]);
    int b = Integer.parsInt(args[1]);
 
    if(b == 0) {
        System.out.println("0으로 나눌 수 없습니다.");
        System.exit(0); //정수는 아무거나 넣어도 된다.
        //프로그램 종료코드 -> jvm에서 메모리 사라짐
        //예외처리X -> 수동으로 그냥 
    }
 
    System.out.println("a를 b로 나눈 몫 = " + (a / b));
    System.out.println("나눗셈이 원활히 수행되었습니다.");
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

*예외처리가 없는 경우

 

 

<예제2>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
class ExceptionError1 {
    public static void main(String args[]) {
        try {
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            System.out.println("a를 b로 나눈 몫: " + (a / b));
        } catch(ArithmeticException e) { //분모가 0
            System.out.println(e + "예외발생");
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println(e + "예외발생");
        } catch(NumberFormatException e) {
            System.out.println(e + "예외발생");
        } catch(Exception e) { //가장 넓은 예외
            System.out.println("알 수 없는 문제가 발생했습니다.");
        }
        finally {
            System.out.println("예외 처리를 끝내고 finally 블럭을 수행합니다.")
        }
        System.out.println("나머지 모듈 정상 작동!");
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

*여러 개의 예외 예측

-> Exception e는 가장 넓은 범위의 예외를 포함하므로 마지막에 항상 쓰인다.

 

 

<예제3>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
class UserException {
    public UserException() {
    }
 
    public UseerException(String message) {
        System.out.println("파일에 에러 내역을 기록합니다.");
        System.out.println("에러 원인: " + message); //예외 
 
class ExceptionError3 {
    public static void main(String args[]) {
 
        try {
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            System.out.println("a를 b로 나눈 몫: " + (a / b));
        } catch(Exception e) {
            new UserException(e.toString());
        } finally {
            System.out.println("예외처리를 끝내고 finally 블럭을 수행합니다.");
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

*실제적으로 가장 많이 사용하는 방식(Exception처리 클래스 따로 생성)

 

 

 

 

<사용자 정의 예외처리(throws Throwable)>

 

: 예외를 예외 처리 클래스로 던져버린다.

->예외를 한 군데로 집중시킬 수 있다.(규격화)

 

 

함수() throws Exception{
실행, 예외 발생
return
}

: 예외를 exception에 담아서 호출한 곳으로 던져라


1)throws: 참조 클래스에 오류 사실을 알려주는 역할을 한다.
단순히 try catch만 있다면 가상머신은 오류/예외 사실을 인식하지 못한다. -> return값만 반환하기 때문

 

 

throws try/catch 의미
O X 나는 처리 안 할 테니 너가 해라
O O 나도 할 테니 너도 해라
X O 난 내 오류 처리하니 넌 알아서 해라

-> 말 그대로 예외를 가상머신으로 던져버림. 처리는 각자 알아서 한다.

 

2)Throwable: 오류를 포함해 가장 넓은 범위의 예외 포함한다.(Exception e보다 넓다) 예외를 가상머신으로 던져버린다. 


3)throw(s 없는 거): 강제 예외를 발생시켜 throws에 던져버린다.



'20.03 ~ 20.08 국비교육 > JAVA' 카테고리의 다른 글

Synchronized  (0) 2020.03.31
스레드(Thread)  (0) 2020.03.30
상수  (0) 2020.03.28
추상 클래스(Abstract class) vs 인터페이스  (0) 2020.03.27
클래스 상속관계에서의 생성자  (0) 2020.03.27