- 프로그램적으로 에러가 아니더라도 로직상 개발자가 일부러 에러를 내서 로그에 기록하고 싶은 상황이 올 수 있다.
- 예외처리를 분산하여 어디에서 에러가 난 것인지 원인을 보다 쉽게 파악할 수 있다.
- 에러에 대한 처리는 웹 보안에 있어서 매우 중요하다.
[ sysntax error ]
컴파일 불가능한 상태로, 실행이 안된다
[ runtime error ]
실행중 발생하는 에러
문법적으로 잘못된건 없어 컴파일은 되지만 실행은 안된다
< try~ catch~ finally >
try -> 에러 -> catch e에 담김 -> finally
필요없으면 finally 생략 가능
일부러 에러를 내는 것이므로, 프로그램적으로 문제가 있는 것이 아니여서 프로그램이 뻗진 않는다
/**
* 1) 파일 복사를 수행하는 기능에서 하드디스크의 용량이 가득 찬 경우
* 2) 다운로드를 수행하는 기능에서 인터넷 접속이 끊긴 경우
* 3) USB에 파일을 저장하는 과정에서 USB의 연결이 강제로 해제된 경우
*
* 위와 같은 상황은 if문으로 해결이 어렵기 때문에
* 자바에서는 예외 상황에 대처하기 위한 try catch finally 문법 제공
*/
public class Ex03_예외처리 {
public static void main(String[] args) {
int[] k = {10,20,30};
try {
// 에러가 발생할 것으로 예상되는 코드를 try블록으로 감싸기
for ( int i=0; i<5; i++ ) {
System.out.println(k[i]);
}
} catch (Exception e) {
/** try 블록 안에서 에러가 발생하는 경우 실행되는 블록
* try 는 항상 catch와 함께 명시돼야 함
* try 블록 수행하는 과정에서 에러 발생하면 프로그램 다운되지 않고 그 즉시 catch블록으로 제어가 이동된다
*/
System.out.println("에러 발생");
System.out.println("에러 원인: " + e.getMessage());
// 시스템에 의해 출력되는 에러메시지 전문을 강제로 출력
System.out.println("====================");
e.printStackTrace();
System.out.println("====================");
} finally {
// 에러 발생 여부에 상관없이 무조건 실행되는 블록
// 생략가능
System.out.println("finish");
}
System.out.println("---FIN---");
}
}
e.getMessage()
e.printStackTrace()
public class Ex04_에러상황의_세분화 {
public static void main(String[] args) {
int[] data = {100,200,300};
try {
for (int i=2; i>=-1; i--) {
int k = i!=0? data[i]/i : i;
System.out.println(k);
}
} catch (ArrayIndexOutOfBoundsException e1) {
// 에러의 경우에 수에 따라 여러개 정의하면 상황별로 에러 구분하여 대응할 수 있다
System.out.println("배열의 인덱스를 초과했습니다");
} catch (ArithmeticException e2) {
System.out.println("잘못된 연산입니다");
} catch (Exception e) {
// Exception 클래스는 Java의 모든 예외 클래스에 대한 최상위 클래스
// Exception 객체를 선언하여 모든 에러 상황들이 Exception 형태로 암묵적 형변환 된다
// 모든 예외상황에 대응한 후 마지막에 알 수 없는 에러에 대한 대비책으로 명시해 둘 수 있다
System.out.println("알 수 없는 에러 발생");
System.out.println(e.getMessage());
} finally {
System.out.println("---FIN---");
}
}
}
- Exception 클래스는 Java의 모든 예외 클래스에 대한 최상위 클래스다
- Exception 객체를 선언하여 모든 에러 상황들이 Exception 형태로 암묵적 형변환 된다
- 모든 예외상황에 대응한 후 마지막에 알 수 없는 에러에 대한 대비책으로 명시해 둘 수 있다
throw 명령은 try~catch 구문으로 감싸지거나
throw 명령을 사용하는 메서드는 throws를 통해 강제로 발생하는 에러에 대한 처리를 호출하는 위치로 떠넘겨야 한다
throws Exception 걸린 메서드는 반드시 try catch 해야한다
(Ctrl+.) 빠른수정 > surround with try/catch
내장기능은 다 throws Exception 이 걸려있다