<예외 처리>
-정의
:실행 시 상황에 따라서 발생하는 오류(빨간줄 아님)
코딩 시 오타 등의 이유로 빨간줄이 생기는 현상은 예외가 아닌 단순한 오류 -> 직접 수정한다^^
컴파일까지는 오류가 없어야 한다. 실행시, 입력 인자에 따라 오류가 발생하는 것을 예외라고 한다.
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 |