계기
학교 스터디 프로그램인 '어울림'에 Java를 종목으로 참여하게 되었다.
팀원들과 돌아가면서 발표형식으로 진행하는 이 프로그램은, 여태껏 배우기만 했던 학습체계에서 가르침으로 승화됨에따라 내가 더 성장하는 계기를 만들어 줄 것이다.
아래의 링크를 타고 들어가면 내가 수업을 맡았던 학습본을 같이 볼 수 있다.
https://docs.google.com/presentation/d/1EXFWhgDBX9OhFTOtvmcYUQWFOueRsYmLAWsaJJYiVoo/edit?usp=sharing
예외란?
런타임 오류에 해당하는 것으로, 프로그래머가 직접 예측해 막을 수 있는 처리 가능한 오류다.
예를들어, 어떤 수를 0으로 나눴을 때 그 값은 무한을 가지므로 오류가 발생한다. 이때 "예외가 발생"했다고 한다.
이 경우, 콘솔창에는 다음과 같은 경고문이 나타난다.
cf) 오류란? 어떤 원인 때문에 비정상적인 동작을 일으키며 프로그램이 종료되는 상황을 말한다. 이는 크게 두 가지로 나뉘는데, 코드 작성 중 실수로 발생하게 되는 컴파일 오류와, 의도하지 않은 동작으로 프로그램이 종료되는 런타임오류다. |
cf2)런타임 오류 中 에러 에러란, 프로그램이 코드로 복구될 수 없는 오류로, 메모리 부족으로 인한 OutofMemoryError, StackOverFLowError등이 이에 해당된다. |
따라서 예외는, 의도와 다르게 실행되어 생긴 버그(bug)를 log분석을 통해 원인을 찾아 해결한다.
예외 클래스
이 중에 예외에 대한 모식도를 더 자세하게 톺아보면 다음과 같다.
위의 클래스를 사용하기 위해서는 아래와 같은 클래스 선언이 필요하다.
Class Exception
java.lang.Object
java.langThrowable
java.lang.Exception
이 중, 이 글에서는 입출력 예외 처리 중 FileNotFoundException과 실행 오류 예외 처리 중 IndexOutofBoundsException을 코드예시와 함께 알아보도록 하겠다.
예외 처리를 하는 방법
try-catch
파이썬에서 예외 처리를 하는 방식은 try-except 문이었다. 자바에서는 이와 유사하게 try-catch문을 활용하여 예외를 처리한다.
try-catch문의 기본 문법은 하기와 같다.
try {
//예외가 발생할 수 있는 코드 부분
}catch (처리할 예외 타입 e){
try블록 안에서 예외가 발생했을 때
//예외를 처리하는 부분
}
그렇다면, 예시를 적용해 알아보자.
IndexOutofBoundsException의 경우를 차용하겠다.
IndexOutofBoundsException이란, 리스트형 객체에서 선언되지 않은 요소를 get하는 경우 발생하게 된다.
아래 반복문을 한 번 보자.
int[ ] arr = new int[5];
for(int i = 0; i < 5; i++) {
arr[i] = i;
System.out.println(arr[i]);
}
이 코드는 5개의 배열을 생성하고 각각의 요소에 반복문을 통해 0~4의 값을 할당하는 코드다.
그렇다면, 이건 어떤가?
int[ ] arr = new int[5];
for(int i = 0; i <= 5; i++) {
arr[i] = i;
System.out.println(arr[i]);
}
위와 무엇이 다른지 잠깐 마우스를 놓고 생각해보자.
이 코드는 반복문의 결부분의 연산자가 변화하면서 기존 0~4까지 할당하던 요소를 0~5까지 할당하고 있다.
조금 이상하지 않은가?
배열에 저장하려는 값의 개수가 배열의 범위를 벗어나버렸다. 실행이 제대로 될까?
된다. 무려 오류메시지도 뜨지 않는다.
하지만,,,,5가 나오지 않고 종료되고 만다.(강제종료)
이것을 RuntimeException이라고 한다. 예외처리를 하지 않아도 컴파일 오류가 나지 않는 것이다. 프로그래머가 직접 예외처리를 하지 않으면 프로그램이 비정상적으로 종료된다.
위에도 언급했듯, 이 경우를 "예외가 발생"했다고 하고, try-catch문으로 수정해보겠다.
package exception;
public class ArrayExceptionHandling {
public static void main(String[] args) {
int [] arr = new int[5];
try {
for(int i = 0; i<=5; i++ {
arr[i] = i;
System.out.println(arr[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
System.out.println(“예외처리부분”);
}
}
}
앞에서 발생한 예외가 발생할 수 있는 구간을 try 블록에 작성하고, catch부분에 예외가 발생할 시 수행할 구문을 넣었다.
이 코드를 실행하면, 5의 요소를 할당할 시 값 할당 대신 "예외처리부분"이라는 문구가 콘솔창에 뜨게 된다.
FileNotFoundException
입출력 예외에 해당되는 FileNotFoundException은, 컴파일러에 의해 예외가 체크되는 경우로 실행시 오류 문구가 뜬다.
자바에서 외부 파일을 사용하기 위한 코드는 다음과 같다.
FileInputStream fis = new FileInputStream(“a.txt”);
경고 메시지를 보면, FileNotFoundException의 키워드가 언급되는 것으로 보아 해당 케이스가 발생한 것을 알 수 있다.
아래의 해결메시지를 보면, try-catch문이 있다. 이 또한 위와 같은 방법으로 해결해주면 된다.
또 다른 해결방법인 throws는, 예외를 해당 메서드에서 처리하지 않고 미룬 후 메서드를 호출하여 사용하는 부분에서 예외를 처리하는 방식이다. 아쉽게도, 해당 케이스는 수업과정에서 다루지 않으므로 넘어가도록 하겠다.
try-catch-finally
이 구문은 어떠한 경우에도 반드시 수행하는 부분이 포함된 예외 처리 방식이다.
try {
//예외가 발생할 수 있는 부분
}catch(처리할 예외 타입 e) {
//예외를 처리하는 부분
}finally {
//항상 수행되는 부분
}
try-with-resources
try (A a = new A(); B b = new B()) {
//try문 괄호 안에 리소스 선언
…..
}catch(Exception e) {
,,,,
}
이것은 리소스를 사용하고 해제할 때 쓰는 예외 처리방식이다.
리소스란 사용될 수 있는 어떤 항목을 말한다. 파일, 네트워크, 데이터베이스를 연결하는 장치 등이 해당된다.
'PROGRAMMING > Java' 카테고리의 다른 글
[Java]About Java (0) | 2023.04.13 |
---|