1. 프로그램의 비정상 종료를 방지
2. 실행 오류가 발생한 경우 오류의 과정을 재현하는 것은 힘들고 오류가 발생한 경우 log를 남겨서 분석을 통해 원인을 파악하여 bug를 수정하는 것이 중요( log4j와 자바에서 logging을 사용 )
프로그램에서 오류
1. 컴파일오류
문법적오류
개발환경에서의 컴파일 오류
2. 실행오류 (Runtime)
비정상 종료가 되는 경우
실행 중인 프로그램이 의도하지 않은 동작을 하거나 프로그램이 중지되는 경우
오류 | 시스템 오류 : 가상 머신에서 발생, 프로그래머가 처리 할 수 없는 오류(ex 동적메모리가 없는 경우, 스택메모리 오버플로우 등)
예외(Exception) : 프로그램에서 제어 할 수 있는 오류(ex 파일IO, 네트워크연결, DB연결이 안되는 경우)
예외 클래스 : 모든 예외 클래스의 최상위 클래스는 Exception 클래스 (Object > Throwable > Exception)
Exception 종류
그 외 RuntimeException, IllegalArgumentException, NullPointerException...등 Doc문서 참고...
예외 처리
try~catch 문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class ArrayIndexException {
public static void main(String args[]) {
int[] arr = {1,2,3,4,5};
try {
// 예외처리가 발생할 수 있는 코드 부분
for(int i=0; i<=5; i++) { // 5에서 오류 발생으로 프로그램 중지
System.out.println(arr[i]);
}
// Exception를 핸들링하여 예외처리하여 프로그램을 유지하고 끝까지 실행
// 처리할 예외 타입을 catch문에 정 의
}catch(ArrayIndexOutOfBoundsException e) {
// try 블록 안에 예외가 발생했을 때 처리하는 부분
System.out.println(e.getMessage()); // 에러 메시지
System.out.println(e.toString()); // 에러이름과 에러 메시지
}
}
}
|
cs |
try~catch-finally 문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public class FileExceptionHandle {
public static void main(String args[]) {
// finally는 파일을 닫거나 네트워크를 닫는 등의 리소스 해제를 구현
// ex) rollback, close...등
// try가 수앵되는 경우 finally가 항상 수행
FileInputStream fis = null;
try {
// 1. add throws 상위에 Exception을 던진다
// 2. Surround with try/catch try문 감싸기
fis = new FileInputStream("a.txt"); // a.txt 라는 FileNotFoundException 발생
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// Exception 발생 시 파일IO스트림에 대한 close()를 해줄 시 try/catch문 계속생
// 여러번의 try/catch문을 finally를 통해 한번에 실행
// try {
// fis.close();
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
// e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
|
cs |
try~catch/resource 문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class FileExceptionHandle {
public static void main(String args[]) {
// ()안에서 close()까지 자동으로 구현?실행? 호출
// FileInputStream 클래스가 AutoCloseable인터페이스를 구현하고 있어 close()자동호출
// 다른 경우에서도 AutoCloseable을 구현하고 있으면 자동 호출
try(FileInputStream fis = new FileInputStream("a.txt")) {
}catch(FileNotFoundException e) { // filenotfound
}catch(IOException e) { // close
}
}
}
|
cs |
resouce방법의 AutoClose 확인
1
2
3
4
5
6
7
8
9
10
|
public class AutoCloseableObj implements AutoCloseable{
// AutoCloseable 인터페이스 구현
// 실제론 다른 네트워크연결이나 DB연결, 파일에 대한 연결해제를 구현
@Override
public void close() throws Exception {
System.out.println("close.....");
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class AutoCloseTest {
public static void main(String args[]) {
AutoCloseableObj a = new AutoCloseableObj();
// a에 대한 close 실행을 확인 방법
try(a){
// Exception 강제 발생
throw new Exception();
}catch(Exception e) {
System.out.println("Exception : ");
}
}
}
|
cs |
예외처리 상위로 미루기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class ThrowsException {
// 의도적인 Exception 생성
public Class loadClass(String fileName, String className) throws FileNotFoundException, ClassNotFoundException {
// throws 호출하는 쪽에서 exception 처리
FileInputStream fis = new FileInputStream(fileName); // Exception 핸들링 발생하여 throws
// 클래스 동적으로 load
Class c = Class.forName(className); // Exception 핸들링 발생하여 throws
return c;
}
public static void main(String args[]) {
ThrowsException test = new ThrowsException();
// main에서 Exception 핸들링
try {
test.loadClass("a.txt","abc");
// 올바른 파라미터 넘기면 정상적으로 수행
//test.loadClass("data.txt","java.lang.String");
} catch (FileNotFoundException | ClassNotFoundException e) {
// 멀티로 Exception 처리
// catch의 Exception는 명시되어있지않은 Exception 인경우 // 최상위 Exception은 맨마지막에 처리 e.printStackTrace();
System.out.println(e);
e.getMessage();
}
}
}
|
cs |
'OOP > Java' 카테고리의 다른 글
java.util.logging.Logger 활용 (0) | 2022.05.18 |
---|---|
사용자 정의 예외 클래스 (0) | 2022.05.18 |
연산 수행에 대한 구현 reduce() 연산 (0) | 2022.05.10 |
스트림(Stream) (0) | 2022.05.09 |
람다식 구현 방식 (0) | 2022.05.09 |