에러 발생 시점에 따라서 세가지 정도로 나눌 수 있다.
- 컴파일 에러 (compile- time error) - 컴파일 시에 발생하는 에러
- 런타임 에러 (runtime error) - 실행 시에 발생하는 에러
- 논리적 에러 (logical error) - 실행은 되지만, 의도와 다르게 동작하는 것(예를 들어, 통장의 잔고가 음수로 표현)
예외처리의 목적
예외의 발생으로 인한 실행중인 프로그램의 갑작스러운 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는것이다.
예외처리를 해주지 못하면 프로그램이 비정상적으로 종료되면서 JVM의 '예외처리기(UncaughtExceptionHandler)'가 받아서 예외의 원인을 화면에 출력한다.
예외처리하기
- try - catch문
➜구조
try {
//예외가 발생할 가능성이 있는 문장
} catch (Exception1 e1) {
//Exception1이 발생 했을 때, 처리 할 문장
} catch (Exception2 e2) {
//Exception2이 발생 했을 때, 처리 할 문장
} catch (ExceptionN eN) {
//ExceptionN이 발생 했을 때, 처리 할 문장
}
하나의 try 블럭에 여러 종류의 catch블럭이 올 수 있으며, 일치하는 단 한가지의 catch 블럭만 수행한다. 예외의 종류와 일치하는 catch 블럭이 없으면, 예외는 처리되지 않는다.
➜try-catch-finally블록도 있다.
try{
//예외 발생 가능 코드
} catch (Exception e){
//예외 처리
} finally {
항상 실행;
}
try-catch-finally 블록에서는 try블록 안의 내용이 예외 없이 실행되면, catch블록은 실행되지 않고 finally블록이 실행된다. 만약, try블록에서 예외가 발생된다면 catch블록 실행 후에 finally블록이 실
➜ Web 개발 프로젝트에서 사용된 예시
try {
if (!idx.equals(dto.getIdx())) {
return Response.Err(HttpStatus.BAD_REQUEST, "본문과 요청IDX 상이함");
}
if (!CronExpression.isValidExpression(dto.getCrontab())) {
return Response.Err(HttpStatus.BAD_REQUEST, "크론탭 형식 오류");
}
if (!CommonUtil.isValidUrl(dto.getUrl())) {
return Response.Err(HttpStatus.BAD_REQUEST, "URL 형식 오류");
}
try - catch문의 실행 순서
➜ try 블럭 내에서 예외가 발생 한 경우
1. 일치하는 catch 블럭이 있는지 찾는다.
2. 일치하는 catch 블럭이 있으면 해당 블럭 내의 문장을 수행한다. 후에 try-catch문 전체를 빠져나가 다음줄을 실행한다.
2-1) 일치하는 catch 블럭을 찾지 못하면, 예외는 처리되지 않는다.
➜ try블럭 내에서 예외가 발생 하지 않은 경우
1. catch 블럭을 거치지 않고 전체 try-catch문을 빠져나가서 다음 줄을 실행한다.
printStackTrace()와 getMessage()
➜ printStackTrace()
예외 발생 당시의 호출스택이 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
➜getMessage()
발생한 예외클래스의 인스턴스에 저장된 메세지를 가지고 온다.
➜사용 예시 (getMessage())
public class test {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0/0); //예외발생
System.out.println(4);
} catch (ArithmeticException ae){
ae.printStackTrace();
System.out.println("예외메세지:" + ae.getMessage());
}
System.out.println(6);
}
}
➜실행 결과
1
2
3
예외메세지:/ by zero
6
java.lang.ArithmeticException: / by zero
at test.test.main(test.java:10)
멀티 catch블럭
JDK 1.7부터 지원하는 '|' 기호를 이용한 하나의 catch 블럭을 합칠 수 있게 하는것입니다.
* 만일 멀티 catch블럭의 '|'기호로 연결된 예외 클래스가 조상과 자손의 관계에 있으면 컴파일 에러가 납니다.(그냥 조상클래스만 써주는것과 똑같기 때문에 중복코드는 제거하라는 의미의 에러입니다.)
➜사용 전 코드
try {
...
} catch (ExceptionA e) {
e.printStackTrace();
} catch (ExceptionB e2) {
e.printStackTrace();
}
➜사용 후 코드
try {
...
} catch (ExceptionA | ExceptionB) {
e.printStackTrace();
}
예외 발생시키기
➜"throw"를 사용해서 고의로 예외를 발생시킬 수 있다.
1. new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.
Exception e = new Exception("고의로 발생시킨 부분");
2. throw를 이용해서 예외를 발생시킨다.
throw e;
* 위의 두 줄을 한줄로 줄여쓰면 아래와 같다.
throw new Exception("고의로 발생시킨 부분");
메서드에 예외 선언하기
➜ try-catch문을 사용하는것 이외에 메서드에 선언 하는 방법이 있다.
void method() throws Exception1, Exception2, ... ExceptionN{
//메서드의 내용
}
'JAVA' 카테고리의 다른 글
[Java] Array, ArrayList, HashMap 사용법, 데이터 출력법, 차이점 (0) | 2022.11.04 |
---|---|
[Java] Math.random()을 이용한 주사위 두개 굴리기 예제 (1) | 2022.11.01 |
[Java] if문의 활용 | if, if - else, else - if (0) | 2022.10.28 |
[Java] printf() 메소드를 이용 - %s, %d, %f 사용법 (0) | 2022.10.27 |
[Java] 예외처리 - throws / try with resources (0) | 2022.10.18 |