1. 예외처리
프로그램을 만들다보면 수없이 많은 오류가 발생하기 마련이다.
이는 프로그램이 잘못 작동되지 않게 하기 위한 배려일 수 있다.
하지만 때로는 이런 오류를 무시하고 싶을 때도 있고 오류가 났을 때 그에 맞는 적절한 처리를 하고 싶을 때가 있다.
여기서 오류란 문법 실수(Syntax)에 대한 오류가 아니다, 자바 클래스를 실행시킬 때(Run) 발생하는 오류를 말한다.
그럼 어떤 때에 오류가 발생할까?
지금까지 작업하면서 만났던 여러 오류들이 있다.
예를 들어 없는 배열을 불러왔을 때, 숫자를 0으로 나눴을 때 등등(문법적으론 오류가 없으나 Run이 되지 않는 오류).
그래서 자바에서는 try... catch, throw와 같은 구문을 이용해 오류를 처리할 수 있게 해주기도 한다.
이 구문을 사용해서 자바는 오류를 잡아주기도 하고, 오류가 났지만 우선 프로그램을 정상적으로 종료시켜주는 과정을 가진다. 이것을 예외 처리(Exception)이라 부른다.
예외처리의 문법을 알아보자.
2. 예외처리를 하는 방법
예외 처리를 하는 방법을 알아보기 전에 우선 예외처리를 하지 않으면 어떤 현상이 일어나는지 확인해보자.
확인을 위해서 일부러 오류를 발생시켰다.
보다시피 문법(Syntax)상으론 오류가 없기에 빨간 줄이 그어지지 않지만 Run을 하면 에러가 뜬다.
3을 0으로 나눴기 때문에 에러가 나게 되고, 자바는 그 이후의 프로그래밍은 하지 않은 채 클래스를 강제로 종료시켜버린다.
그래서 자바에서는 예외 처리가 필수적이다.
이제 예외처리를 하여 Exception이 발생하더라도 정상적으로 프로그램을 종료시켜보자.
1) try ... catch 문법
try {
// 예외 발생이 예상되는 코드
} catch(에러코드의 변수화) {
// 예외가 발생되었을 때 처리할 코드 작성
} // end
System.out.println("END"); // 끝까지 프로그램이 정상적으로 작동된 후 종료하였는지 알아보기 위해 주로 넣는다
위의 방식으로 try ... catch 문법을 사용한다.
여기서 catch 부분은 특별한 코드가 들어가지는 않는다.
어차피 오류가 나면 고쳐야하기 때문에..
아무튼 위의 문법을 사용해보자.
근데 여기서 문득 질문이 든다.
예외 발생이 예상되는 코드를 어떻게 미리 예측해?
- 걱정하지 말자, 대부분 자바가 해준다
그럼 위의 오류가 났었던 코드를 넣어서 한번 사용해보자.
try {
// 예외 발생이 예상되는 코드
System.out.println(1);
System.out.println(3/0);
System.out.println(5);
} catch(ArithmeticException e) {
// 예외가 발생되었을 때 처리할 코드 작성
System.out.println(e);
} // end
System.out.println("END");
출력 결과를 보면 오류가 발생했음에도 자바가 프로그램 Run을 강제로 멈추지 않고 END까지 잘 출력하는 것을 확인할 수 있다.
이런 식으로 try .. catch 를 사용한다.
2) 다중 catch문
만약에 작성한 코드 안에 오류를 발생시킬 수 있는 여러 요소가 존재한다면 catch문을 반복해서 사용하는 것으로 다양한 오류를 확인할 수 있다.
try {
int a=2/0;
int b=Integer.parseInt("KOREA");
int[] num=new int[3];
num[5]=7;
} catch (ArithmeticException e) {
System.out.println(e);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println(e);
} catch (NullPointerException e) {
System.out.println(e);
} // end
System.out.println("END");
만약 오류가 발생한다면 첫번째 오류를 확인한 시점에서 try문에서 catch문으로 넘어가서 오류를 출력시키고 try ... catch문을 빠져나간다.
3) 다형성을 활용하여 try ... catch문 작성하기
그런데 이렇게 수~~~많은 Exception을 하나하나 다 적는 것은 어려움이 많다.
여기서 우린 이전에 함께 알아보았던 다형성을 활용하여 처리를 할 필요를 느끼는 것이다.
이 모든 *Exception들은 Exception이라는 클래스의 자식클래스들이다.
그래서 부모클래스인 Exception 클래스로 작성해주면 그 아래 있는 모든 자식 클래스들과 연결이 가능하게 된다.
try {
int a=2/0;
int b=Integer.parseInt("KOREA");
int[] num=new int[3];
num[5]=7;
} catch (Exception e) {
System.out.println(e);
}
System.out.println("END");
4) finally문
finally문은 try ... catch문 안에서 쓰이며 예외가 발생하든, 발생하지 않든 무조건 실행하는 문이다.
왜 무조건 실행하는 기능이 필요한 것일까.
예를 들어 데이터베이스를 사용한다면 데이터베이스 서버에 접속해야 한다.
이 때 데이터베이스 서버와 여러분이 작성한 에플리케이션은 서로 접속상태를 유지하게 되는데 데이터베이스를 제어하는 과정에서 예외가 발생해서 더 이상 후속 작업을 수행하는 것이 불가능한 경우가 있을 수 있다. 그 때 예외가 발생했다고 데이터베이스 접속을 끊지 않으면 데이터베이스와 연결 상태를 유지하게 되고 급기야 데이터베이스는 더 이상 접속을 수용할 수 없는 상태에 빠질 수 있다.
이렇게 접속을 끊는 작업은 예외 발생여부와 상관없기 때문에 finally에서 처리하기에 좋은 작업이라고 할 수 있다.
말하자면 finally는 작업의 뒷정리를 담당한다고 볼 수 있다.
try {
// 예외 발생이 예상되는 코드
} catch(에러코드의 변수화) {
// 예외가 발생되었을 때 처리할 코드 작성
} finally {
// 무조건 실행할 내용
} // end
System.out.println("END");
실제 예제 코드를 살펴보며 더 잘 알아보자.
try {
System.out.println("OPEN");
System.out.println(1/0);
} catch (Exception e) {
System.out.println(e);
} finally {
System.out.println("CLOSE");
}// end
System.out.println("END");
아까와 마찬가지로 일부러 Exception을 발생시켰다.
그런데 차이점이 있다면 Exception이 발생한 순간 try문의 남은 과정은 무시하고 빠져나왔었는데 여기선 finally문의 내용을 무조건 실행한 후 빠져나오는 것을 확인할 수 있다.
3. 개발자들이 자주 보게 되는 Exception 모음집.zip
1) ArrayIndexOutOfBoundsException
존재하지 않는 배열에 접근할 때 나는 오류.
try {
System.out.println(1);
int[] num = new int[3];
num[5]=2;
System.out.println(7);
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
} // end
System.out.println("END");
2) * FormatException
자료형이 맞지 않을 때 발생하는 오류.
* 안에는 Number등이 들어간다.
try {
System.out.println(1);
int num=Integer.parseInt("KOREA");
System.out.println(3);
} catch (Exception e) {
System.out.println(e);
} // end
System.out.println("END");
3) NullPointerException
어느 값이 Null일 때 발생하는 오류.
try {
System.out.println(1);
Integer inte=null;
System.out.println(5/inte);
} catch (NullPointerException e) {
System.out.println(e);
}
System.out.println("END");
4) ArithmeticException
수학적인 계산의 과정에서 발생하는 오류.
예시는 위에 있기에 따로 달지 않았다.
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #9-3 제네릭(Generic) 이해하기 1 - 컬렉션 프레임워크 (0) | 2022.09.16 |
---|---|
[JAVA] #9-2 예외처리(Exception) 2 - throws (0) | 2022.09.16 |
[JAVA] #8-6 이너 클래스(Inner Class) (0) | 2022.09.15 |
[JAVA] #8-5 익명 내부 객체(Anonymous class) (0) | 2022.09.15 |
[JAVA] #8-4 인터페이스(Interface) (0) | 2022.09.15 |