열심히 짠 코드, 잘 굴러가면 정말 좋겠지만 때론 예상치 못한 에러가 나곤 한다. 개발자의 실수도 있을것이고, 프로그램 자체의 문제일 수도 있을것이고, 예상치 못한 경우도 있을것이다.
상황을 하나 가정해보자. Wrapper클래스를 이용하여 문자열을 숫자로 변환할때, 문자열 안에 담긴 값이 숫자라면 문제가 없겠지만, 안에 들어있는 값이 문자라면 에러가 뜰 것이다. Java 프로그램은 예외상황을 만나면 그 즉시 실행을 중단하고 강제 종료된다.
public class Main01 {
public static void main(String[] args) {
// 문자열의 숫자 변환에 아무런 문제가 없다.
String year1 = "1980";
int age1 =2014 - Integer.parseInt(year1) + 1;
System.out.println(age1);
// 숫자로 변환할 수 없으므로, 에러가 발생한다.
String year2 = "뭘까요?";
int age2 = 2014 - Integer.parseInt(year2) + 1;
System.out.println(age2);
System.out.println("---- 프로그램을 종료합니다. ----");
}
}
public class Main02 {
public static void main(String[] args) {
int[] arr = new int[3];
for (int i = 0; i < 5; i++) {
if (i < arr.length) {
arr[i] = i; // <-- i가 3일때 에러 발생
System.out.println(arr[i]);
}
}
}
}
try {
// 기본적으로 실행되는 부분
} catch (예외클래스이름 객체이름) {
// try 블록에서 예외가 발생(런타임 에러)한 경우 이 곳으로 제어가 넘어온다.
) finally {
// 에외 상황의 발생 여부에 상관 없이 무조건 실행되는 부분
// finally 블록은 생략 가능하다.
}
public class Main03 {
public static void main(String[] args) {
try {
String year2 = "뭘까요?";
// 숫자 형식 에러(NumberFormatException)
// try블록 안에서 에러를 만나면 catch 블록으로 점프한다.
int age2 = 2014 - Integer.parseInt(year2) + 1;
System.out.println(age2);
} catch (NumberFormatException e) {
System.out.println("에러가 발생했습니다.");
System.out.println("원인: " + e.getMessage());
}
System.out.println("---- 프로그램을 종료합니다. ----");
}
}
public class Main04 {
public static void main(String[] args) {
int[] arr = new int[3];
try {
for (int i = 0; i < 5; i++) {
arr[i] = i; // <-- i가 3일때 에러 발생
// (ArrayIndexOutOfBoundsException)
System.out.println(arr[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("에러 발생");
System.out.println("원인:" + e.getMessage());
}
System.out.println("---- 프로그램을 종료합니다. ----");
}
}
public class Main05 {
public static void main(String[] args) {
// 사용자의 입력값을 가정
String[] src = { "가", "2", "aaa", "ccc" };
// 벌써부터 틀리는 스멜이 난다.
// src의 내용들을 숫자로 변환해서 저장할 배열
int[] arr = new int[3];
try {
for(int i = 0; i < src.length; i++) {
arr[i] = Integer.parseInt(src[i]);
System.out.println(arr[i]);
}
// 발생할 수 있는 예외의 종류에 따라서 catch 블록 세분화
} catch (NumberFormatException e) {
System.out.println("입력값에 오류가 있습니다.");
// 개발자가 보려는 용도로 출력하는 시스템 에러 메시지
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("데이터가 너무 많습니다.");
e.printStackTrace();
} catch (Exception e) {
// 예외 종류를 의미하는 모든 클래스는
// java.lang.Exception 클래스를 상속받으므로
// 이 블록은 모든 종류의 예외에 대해 대처할 수 있다.
System.out.println("알 수 없는 예외가 발생했습니다.");
e.printStackTrace();
} finally {
// 이 블록은 예외의 발생 여부에 상관없이 무조건 실행된다.
System.out.println("데이터 변환 종료");
}
System.out.println("---- 프로그램을 종료합니다. ----");
}
}
이 포스트는 itpaper.co.kr에서 제공되는 강의자료를 바탕으로 작성되었습니다.