프로그램을 만들다 보면 수없이 많은 오류가 발생한다.
물론 오류가 발생하는 이유는 프로그램이 오동작을 하지 않기 위한 자바의 배려이다.
하지만 때로는 이러한 오류를 무시하거나, 그에 맞는 적절한 처리를 하고 싶을 때가 있다.
이에 자바는 try ... catch, thorw 구문을 이용하여 오류를 처리한다.
대표적인 오류 발생 원인
- 존재하지 않는 파일 읽기
: 존재하지 않는 파일을 열려고 시도하면 FileNotFoundException 라는 이름의 예외가 발생한다. - 다른 숫자로 0을 나누기 (3 / 0)
: 3을 0으로 나누면 ArithmeticException 예외가 발생한다. - 정해진 배열 범위를 벗어날 때
: 배열 값이 3개 일 때 4번째 배열 값을 인덱스 할 시 ArrayIndexOutOfBoundsException 예외가 발생한다.
예외 처리하기
예외처리를 위한 try, catch문의 기본 구조
try {
...
} catch(예외1) {
...
} catch(예외2) {
...
}
try 문안의 수행할 문장들에서 예외가 발생하지 않는다면
catch 문에 속한 문장들은 수행되지 않는다.
하지만 예외가 발생한다면
catch 문에 속한 문장들이 수행된다.
숫자를 0으로 나누었을 때 발생하는 예외를 처리하려면 다음과 같이 할 수 있다.
public static void main(String[] args) {
int c;
try {
c = 4 / 0;
} catch(ArithmeticException e) {
c = -1; // 예외가 발생하며 이 문장이 수행된다.
}
}
}
ArithmeticException이 발생하면 c에 -1을 대입하도록 예외를 처리한 것이다.
ArithmeticException e 에서 e는 ArithmeticException 클래스의 객체, 즉 오류 객체에 해당한다.
이 오류 객체를 통해 해당 예외 클래스의 변수나 메서드를 호출할 수도 있다.
finally
프로그램 수행 도중 예외가 발생하면 프로그램이 오류에 의해 중지되거나 예외 처리에 의해 catch 구문이 실행된다.
하지만 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 어떻게 해야 할까?
다음의 예제를 보도록 하자.
public class TestClass{
public void shouldBeRun() {
System.out.println("ok thanks.");
}
public static void main(String[] args) {
TestClass testClass = new TestClass();
int c;
try {
c = 4 / 0;
testClass.shouldBeRun(); // 이 코드는 실행되지 않는다.
} catch (ArithmeticException e) {
c = -1;
}
}
}
위 예를 보면 testClass.shouldBeRun() 코드는 절대로 실행될 수 없을 것이다.
왜냐하면 4 / 0에 의해 ArithmeticException 이 발생하여 catch 구문으로 넘어가기 때문이다.
testClass.shouldBeRun() 메서드는 반드시 실행되어야 하는 메서드라고 가정해보자.
이런 경우를 처리하기 위해 자바는 finally 구문을 제공한다.
다음의 예를 보자.
public class TestClass{
public void shouldBeRun() {
System.out.println("ok thanks.");
}
public static void main(String[] args) {
TestClass testClass = new TestClass();
int c;
try {
c = 4 / 0;
} catch (ArithmeticException e) {
c = -1;
} finally {
testClass.shouldBeRun();
}
}
}
finally 구문은 try 문장 수행 중 예외발생 여부에 상관없이 무조건 실행된다.
따라서 위 코드를 실행하면 testClass.shouldBeRun() 메서드가 수행되어 "ok, thanks." 문장이 출력된다.
'Language > Java' 카테고리의 다른 글
Java - super, super() (0) | 2023.04.13 |
---|---|
Java - Code Sample (0) | 2023.04.13 |
Java - Static (0) | 2023.03.27 |
Java - Access Modifier (0) | 2023.03.27 |
Java - Abstract Class (0) | 2023.03.27 |