예외처리
예외(Exception)
단순한 문법 오류가 아닌 실행 중간에 발생하는 ‘정상적이지 않는 상황’ 을 뜻한다.
사용하는 이유
프로그램을 만들다 보면 수없이 많은 오류가 발생한다. 이러한 오류를 무시하고 싶을 때도 있고, 오류가 날 때 그에 맞는 적절한 처리를 하고 싶을 때도 있다. 이에 자바는 try ... catch, throw 구문을 이용해 오류를 처리 한다.
Exception과 Error의 차이
•
Exception(예외) : 개발자의 구현 실수나 사용자의 의해 발생되는 문제로 개발자가 미리 예측하여 방지 할 수있기에 상황에 맞는 예외 처리를 해야한다.
•
Error(오류) : 프로그램에 심각한 문제를 야기하여 실행중인 프로그램이 강제적으로 종료된다. 이러한 오류는 개발자가 미리 예측 처리할 수 있는 부분이 없다.
•
예외처리를 해야만 실행되는경우(CheckedException)
•
예외처리를 하지 않아도 실행되는 경우(UncheckedException)
예외 처리하기
1. try, catch 문의 기본 구조
•
try 문 안에 수행할 문장들이 예외가 발생하면 catch 문이 수행된다.
int c;
try {
c = 4 / 0;
} catch(ArithmeticException e) {
// 예외가 발생하여 이 문장이 수행된다.
System.out.println("예외가 발생하여 이 문장이 수행된다.");
}
Java
복사
finally
•
finally문은 사용하면 예외에 상관없이 무조건 수행된다.
int c;
try {
c = 4 / 0;
} catch(ArithmeticException e) {
// 예외가 발생하여 이 문장이 수행된다.
System.out.println("예외가 발생하여 이 문장이 수행된다.");
}finally {
// 예외에 상관없이 무조건 수행된다.
System.out.println("예외에 상관없이 무조건 수행된다.");
Java
복사
2. throw & throws
throw&throws
throw는 예외를 발생시킬수 있는 코드를 강제로 예외를 발생시킨 후 throws를 통해 예외를 모아 처리하거나 try&catch문을 통해 예외를 처리한다.
throw 예제
public class ExcepTest {
public static void main(String[] args) {
try {
myException();
} catch (Exception e) {
e.printStackTrace();
System.out.println("myclass에서 예외가 발생하였습니다.");
}
}
static public void myException() {
try {
throw new Exception();
}
catch(Exception e) {
e.printStackTrace();
System.out.println("myException에서 예외가 발생하였습니다.");
}
}
}
Plain Text
복사
출력
java.lang.Exceptionat ExcepTest.
myException(ExcepTest.java:22)at ExcepTest.main(ExcepTest.java:11)
myException에서 예외가 발생하였습니다.
==> main 메서드에서 myException메서드를 호출하고, 여기서 throw를 통해 Exception을 강제로 발생시키고 있다.때문에 catch 블럭으로 처리가 위임되고, 여기서 예외를 처리하고 있다.
throws 예제
public class ExcepTest {
public static void main(String[] args) {
try {
myException();
} catch (Exception e) {
e.printStackTrace();
System.out.println("myclass에서 예외가 발생하였습니다.");
}
}
static public void myException() throws Exception{
throw new Exception();
}
}
Plain Text
복사
출력
java.lang.Exceptionat ExcepTest.myException(ExcepTest.java:19)at
ExcepTest.main(ExcepTest.java:8)
myclass에서 예외가 발생하였습니다.
==>throw를 통해 예외를 발생시키고 throws는 이 예외를 상위클래스로 던져버리고 있다.
throws 예제2
==>
22줄에 throw e를 통해 예외를 발생시키면 throws에 의해 상위 메서드로 예외를 던지게 된다.
주의 할 점
try {
c = 4 / 0;
} catch (ArithmeticException e) {
e.printStackTrace();
System.out.println(e.getMessage());
System.out.println("비정상 처리");
} catch (InputMismatchException e) {
// catch 부분을 하나더 추가 시켜 InputMismatchException(문자열 에러) 를 추가킨다
System.out.println("정수만 입력가능합니다.");
} catch (Exception e) {
System.out.println("오류입니다. 숫자로 다시입력해주세요.");
}
finally {
System.out.println("필수적으로 실행");
}
Java
복사
•
다양한 예외 구문이 있지만 각각에 예외 구문을 처리하고 싶을 때
•
Exception 이 제일 위 에있으면 컴파일 에러가 난다.
•
Exception이 제일 위에 있으면 아래 있는 게 적용이 되지 않기 때문이다.
•
많은 예외 처리 구문을 사용 할 때 가장 아래 놓아야 된다.
•
catch는 여러개 추가할 수 있다.
•
위의 코드에서 c = 4 / 0; 에서 오류가 발생하면 그 아래의 코드는 실행되지않는다.
반드시 실행되어야할 코드라면 finally에 작성해야한다.
취합
우주완
이상훈
서태건