잘못된 코드, 부정확한 데이터 등 예외적인 상황에서 오류가 발생할 수 있다. 이런 오류를 예외(exception) 이라고 한다.
public class DivideByZero {
public static void main(String[] args) {
int num = 10 / 0;
System.out.println(num);
}
}

10을 0으로 나누는 코드를 만들었을 때, 문법적으로는 오류가 없지만 실행 결과는 오류가 난다.
정수를 0 으로 나누면 무한대의 값이 발생하기 때문이다. 그래서 0의 값은 예외 처리가 필요하다.
try-catch 구조
try { // 예외가 발생할 수 있는 코드
} catch(예외클래스 변수){ // 예외를 처리하는 코드
} finally { // try-catch 가 종료되면 무조건 실행됨, 생략 가능
}
public class DivideByZeroOk {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자를 입력하세요: ");
int num = sc.nextInt();
int result;
try {
result = 10 / num;
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("0은 넣으면 안됨");
}
}
}
try-catch 를 이용해 0을 예외처리 했다.
숫자값을 입력받으면 나누기 값을 출력하되, 0 을 입력하면 catch 이후의 코드가 실행된다.

예외의 종류
컨파일 익셉션(Compile exception) : 코드 실행 전 확인할 수 있는 예외 런타임 익셉션(Runtile exception) : 코드 실행 후 확인할 수 있는 예외
class divide1 {
void divide(int num) throws RuntimeException {
System.out.println(10 / num);
}
}
public class DivideByZeroOk {
public static void main(String[] args) {
divide1 d1 = new divide1();
d1.divide(10);
}
}

divide 클래스에서 메서드를 호출한 메인 클래스로 처리를 넘기는 (throws) 코드를 만들었다.
RuntimeException 은 코드 실행 후 오류 확인이 가능하기 때문에 0을 나눠도 코드 상 오류가 나지 않고, 실행 시 오류를 확인할 수 있다.

class divide1 {
void divide(int num) throws Exception {
System.out.println(10 / num);
}
}
public class DivideByZeroOk {
public static void main(String[] args) {
divide1 d1 = new divide1();
d1.divide(0);
}
}

이번에는 Exception 클래스로 변경했다. Exception 클래스는 컨파일 Exception 이라 실행 전 오류를 확인할 수 있다. 그래서 예외처리를 반드시 해야 한다.
class divide1 {
void divide(int num) throws Exception {
System.out.println(10 / num);
}
}
public class DivideByZeroOk {
public static void main(String[] args) {
System.out.print("숫자를 입력하세요: ");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
divide1 d1 = new divide1();
try {
d1.divide(num);
} catch (Exception e) {
System.out.println("0은 넣으면 안됨");
}
}
}

Share article