자바에서는 에러 이외에 예외라고 부르는 오류가 있음. 예외란 잘못된 사용 또는 코딩으로 인한 오류를 말함. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하지만, 예외 처리를 통해 계속 실행 상태를 유지할 수 있음.
일반 예외
컴파일러가 예외 처리 코드 여부를 검사하는 예외
실행 예외
컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외
자바는 예외가 발생하면 예외 클래스로부터 객체를 생성함. 이 객체는 예외 처리시 사용됨. 자바의 모든 에러와 예외 클래스는 Throwable을 상속받아 만들어지고, 추가적으로 예외 클래스는 java, lang,m Exception 클래스를 상속받음.

예외가 발생했을 때 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 함. 예외 처리 코드는 try-catch-finally 블록으로 구성 됨.

try 블록에서 작성한 코드가 예외 없이 정상 실행되면 catch 블록은 실행되지 않고 finally 블록이 실행 됨.
예외 발생 여부와 상관없이 finally 블록은 항상 실행됨. 심지어 try 블록, catch 블록에서 return 문을 사용하더라도 finally 블록은 항상 실행됨. finally 블록은 옵션으로 생략 가능함.
package ch11.sec02.exam01;
public class ExceptionHandlingExample1 {
public static void printLength(String data) {
int result = data.length();
System.out.println("문자 수 " + result);
}
public static void main(String[] args) {
System.out.println("[프로그램 시작]\\n");
printLength("ThisIsJava");
printLength(null);
System.out.println("[프로그램 종료]");
}
}
package ch11.sec02.exam01;
public class ExceptionHandlingExample2 {
public static void printLength(String data) {
try {
int result = data.length();
System.out.println("문자 수: " + result);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
//System.out.println(e.toString);
//e.printStackTrace();
} finally {
System.out.println("마무리 실행");
}
}
public static void main(String[] args) {
System.out.println("[프로그램 시작]\\n");
printLength("ThisIsJava");
printLength(null);
System.out.println("[프로그램 종료]");
}
}
ClassPath 위치에서 주어진 클래스를 찾는 코드임. 찾지 못했을 경우, ClassNotFoundException이라는 일반 예외가 발생함.
package ch11.sec02.exam02;
public class ExceptionHandlingExample {
public static void main(String[] args) {
try {
Class.forName("java.lang.String");
System.out.println("java.lang.String 클래스가 존재합니다.");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println();
try {
Class.forName("java.lang.String2");
System.out.println("java.lang.String2 클래스가 존재합니다.");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
try 블록에는 다양한 종류의 예외가 발생할 수 있음. 이 경우, 도중 catch를 사용하면 발생하는 예외에 따라 예외 처리 코드를 다르게 작성할 수 있음. catch 블록의 예외 클래스는 try 블록에서 발생된 예외의 종류를 말하는데, 해당 타입의 예외가 발생하면 catch 블록이 선택되어 실행됨.

catch 블록이 여러 개라 할지라도 catch 블록은 단 하나만 실행됨. 그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않으며, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문임.
package ch11.sec03;
public class ExceptionHandlingExample {
public static void main(String[] args) {
String[] array = {"100", "loo"};
for (int i = 0; i <= array.length; i++) {
try {
int value = Integer.parseInt(array[i]);
System.out.println("array[" + i + "]; " + value);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스가 초가됨: " + e.getMessage());
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없음: " + e.getMessage());
}
}
}
}