1. 에러 vs 예외
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
에러는 메모리부족이나 스택오버플로우와 같이 일단 발생하면 복구할 수 없는 오류이고, 예측이 불가능하다. 즉, JVM 실행에 문제가 생긴 것이므로, 개발자가 대처할 방법이 없다.
예외는 발생하더라도 수습할 수 있는 비교적 덜 심각한 오류를 말한다. 즉, 알고리즘 오류로 Exception 예외가 계속 발생한다 하더라도 Error처럼 프로그램이 죽거나 그럴 경우는 적다. 하지만, 예외에 대한 오류처리를 하지 않으면 프로그램에 문제를 야기할 수 있다.
대부분의 예외는 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생되는데, 이에 대한 대응 코드를 미리 작성해 놓으면 프로그램의 비정상적인 종료를 막을 수 있다. → try - catch문법 사용
따라서 개발자는 예외처리(exception handling)을 통해 예외를 처리하여 프로그램이 종료되는 일이 없도록 코드의 흐름을 변경할 필요가 있다.
2. Exception 처리
1) try - catch
try {
예외가 생길 가능성이 있는 코드 작성
} catch(예외발생 클래스명 e){
예외처리 코드
}
public class Main {
public static void main(String[] args){
int num1, num2;
num1 = 12;
num2 = 0;
try {
System.out.println(num1/num2);
} catch (Exception e) {
System.out.println("0으로 값을 나눌 수 없습니다.");
}
}
}
결과
0으로 값을 나눌 수 없습니다.
try - catch문이 없다면
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:10)
이런식으로 ArithmeticException (런타임 예외)이라고 뜨면서 에러가 발생한다.
자바에서는 Excetpion 클래스를 상속받는 다양한 Exception 클래스를 가지고있다. 여러 에러가 발생할 가능성이 있다면, 각각의 에러에 대하여 예외처리 구문을 작성해야 한다.
public class ExceptionTest {
public static void main(String[] args) {
//int n1, n2;
int[] intArray = {0, 1, 2};
//n1 = 12;
//n2 = 0;
try {
// System.out.println(n1/n2);
System.out.println(intArray[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("ArithmeticException: " + e.getMessage());
}
}
}
try문에서 n1/n2 부분을 주석처리를 하였다. 왜냐하면 처음 에러가 발생하여 예외 처리하는 경우 try문안에 있는 그 다음은 실행하지 않는다.
intArray는 길이가 3인 배열인데, try 구문에서 intArray[3]에 접근하고 있다. 존재하지 않는 배열에 접근하게 되는 경우 ArrayIndexOutOfBoundsException(런타임 예외)이 발생하여 catch문으로 이동하여 catch 구문이 동작될 것이다.
예외가 발생여부에 상관없이 소스 코드를 실행시킬 때에는 finally 구문을 사용해야한다.
[ finally ]
public class ExceptionTest {
public static void main(String[] args) {
//int n1, n2;
int[] intArray = {0, 1, 2};
//n1 = 12;
//n2 = 0;
try {
// System.out.println(n1/n2);
System.out.println(intArray[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("ArithmeticException: " + e.getMessage());
} finally {
System.out.println("무조건 실행된다.")
}
}
}
결과
무조건 실행된다.
'TIL' 카테고리의 다른 글
240501 TIL (0) | 2024.05.01 |
---|---|
240430 TIL (0) | 2024.05.01 |
240426 TIL : 계산기 (0) | 2024.04.26 |
240425 TIL (0) | 2024.04.25 |
240424 TIL 3일차 (0) | 2024.04.24 |