프로그램을 작동시킬 때 종종 예기치 못한 상황을 만나게 된다. 이런 상황들은 처음에 프로그램을 만든 프로그래머가 의도한 상황이 아니기 때문에 프로그램 실행 전체에 악영향을 끼칠 수 있다. 이러한 상황 중에서 개발자가 조치할 수 없는 수준의 오류를 에러, 수습될 수 있는 비교적 덜 심각한 오류를 예외라고 한다.
에러 : 개발자가 조치를 취할 수 없는 수준
컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 프로그램이 실행하는 도중에 발생하는 에러
로직 에러 : 실행은 되지만 의도와는 다르게 동작하는 에러
예외 : 다른 방식으로 처리 가능한 오류
예외가 발생했을 때 이를 적절히 처리하여 프로그램이 비정상적으로 종료되는 것을 막는 방법이다.
try
문에는 예외가 발생할 수 있는 문장을 넣고 catch
문에는 예외가 발생할 경우의 처리방법을 작성한다.
try{
//예외 발생할 가능성이 있는 문장들
} catch(예외 1){
//예외 1에 알맞은 처리
} catch(예외 2){
//예외 2에 알맞은 처리
}
try
문으로는 예외가 발생할 가능성이 있는 문장들을 중괄호로 묶어 준다. 그리고 catch
문의 소괄호()
에는 발생할 가능성이 있는 예외 클래스의 종류와 참조변수를 적어주고 중괄호 {}
안에는 예외가 발생했을 때 실행해야 할 코드들을 작성한다. 만약 발생할 예외의 수가 많다면 복수의 catch
문을 사용할 수도 있다.
public class Exception1 {
public static void main(String[] args) {
try {
int[] a = {2,0};
int b = 4;
int c = b/a[2];
System.out.println(c);
} catch(ArithmeticException e) {
System.out.println("산술 오류발생");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열 길이 오류발생");
}
System.out.println("예외 처리 공부 ");
}
}
// 실행결과
// 배열 길이 오류발생
// 예외 처리 공부
try - catch 문에 선택적으로 finally라는 구문을 추가한다. try구문 내부에서 오류가 발생하든 하지 않든 간에 상관없이 무조건 실행되는 구문이다.
public class Exception1 {
public static void main(String[] args) {
int a = 0;
int b = 2;
try {
System.out.println("외부로 접속");
int c = b / a;
} catch(ArithmeticException e) {
System.out.println("오류가 발생했습니다.");
} finally {
System.out.println("무조건 연결 해제");
}
}
}
/*
실행결과
외부로 접속
오류가 발생했습니다.
무조건 연결 해제
*/
프로그래머가 고의로 예외를 발생시킬 수도 있다. 예외 클래스의 인스턴스를 생성한 다음 키워드 throw를 이용하면 직접 예외를 발생시킬 수 있다.
Exception e = new Exception("Exception"); throw e; // 예외 발생
public class Exception1 {
public static void main(String[] args) {
try {
Exception e = new Exception("고의 예외");
throw e;
} catch(Exception e) {
System.out.println("예외 발생");
System.out.println(e.getMessage());
}
}
}
/*
실행결과
예외발생
고의예외
*/
예외 던지기란 예외가 발생했을 경우 현재 메서드가 예외를 처리하지 않고 자신을 호출한 쪽으로 예외 처리에 대한 책임을 넘기는 것이다.
void method() throws Exception{ //생략 }
다음은 try
문 내부에 다른 try-catch
문을 넣은 구조 속에서 예외가 어떻게 처리되는지 알아보는 코드이다.
public class Exception1 {
public static void main(String[] args) {
try {
System.out.println("외부 try...");
try {
System.out.println("내부 try...");
Exception e = new Exception();
throw e;
}
catch(Exception e) {
System.out.println("(내부 try-catch) exception : " + e);
System.out.println("예외 던지기 한번더 : ");
throw e;
}
finally {
System.out.println("finally 구문출력");
}
}
catch(Exception e) {
System.out.println("(외부 try-catch) Catch exception : " + e);
}
System.out.println("종료");
}
}
/*
실행결과
외부 try...
내부 try...
(내부 try-catch) exception : java.lang.Exception
예외 던지기 한번더 :
finally 구문출력
(외부 try-catch) Catch exception : java.lang.Exception
종료
*/