8.10 예외 처리란?
예외(exception)
: exceptional event의 약자.
-일반적인 경우, 오류가 발생하면 프로그램이 종료된다.
그러나 무조건 종료하는 것보다 프로그램에서 오류를 감지하여 자연스럽게 프로그램을 종료하거나, 오류를 처리한 후에 계속 실행할 수 있도록 만드는 것이 좋다.
정수를 0으로 나누는 경우.
-> ArithmeticException이라는 이름의 예외가 발생함.
*버그와 예외
실행 도중에 버그로 인해서도 실행 오류가 발생할 수 있으나, 이러한 버그는 개발 과정에서 모두 수정되어야 함.
자바에서는 버그에 의한 실행 오류도 예외로 취급하지만, 진정한 의미에서의 예외가 아님.
(=>존재해야 할 파일이 없거나 인터넷 서버가 다운된 경우)
try {
// 예외가 발생할 수 있는 코드
} catch (예외 클래스 변수) {
// 예외를 처리하는 코드
}
finally {
// try 블록이 끝나면 무조건 실행되는 코드; 생략 가능
}
-예외마다 하나의 catch 블록을 지정하여야 함.
import java.util.Scanner;
public class DivideByZeroOK {
public static void main(String[] args) {
try {
int result = 10 / 0; // 예외 발생
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
System.out.println("프로그램은 계속 진행됩니다.");
}
}
실행결과
0으로 나눌 수 없습니다.
프로그램은 계속 진행됩니다.

1) Error
2) RuntimeException
3) 나머지 예외 (checked exception)

= 자동 리소스 관리 (Java 7 도입)
: try catch 블록 내에서 사용되는 리소스를 자동으로 닫는다.
•방법
: try 괄호 안에 필요한 리소스를 선언하기만 하면 된다.
-생성된 리소스는 블록의 끝에서 자동으로 닫힌다.
import java.io.*;
public class TryTest {
public static void main(String args[]) {
try (FileReader fr = new FileReader("test.txt")) { // 괄호가 있으면 자원으로 취급
char[] a = new char[50];
fr.read(a);
for (char c : a)
System.out.print(c);
} catch (IOException e) {
e.printStackTrace();
}
}
}
-FileReader 객체가 try-with-resource 문장 안에 선언되었으므로, 해당 리소스는 블록 끝에서 무조건 닫힘.
*이 기능을 사용하려면 java.lang.AutoCloseable 인터페이스를 구현하여야 함. Java SE 7 버전부터 FileReader 클래스는 이 인터페이스를 구현하고 있음.
-예외를 바로 처리하지 않으려면 메소드 정의에 "throws"로 표시하여야 한다.
하위 메소드 => 상위 메소드
: 서브 메소드 -> 메인 메소드 -> JVM
*try와 catch 블록은 별도의 독립된 블록.

1. 프로그램 실행 중에 잘못된 동작이 발생했을 때.
2.
1) 처리
: 사용자가 오류를 인지하고 적절히 대처 가능.
2) 처리X
: 프로그램이 곧바로 종료됨.
3. 프로그램이 계속 실행될 수 있어 프로그램의 안정성을 높임.
4.
1) try 블록 내부
2) catch 블록 내부
5.
import java.util.*;
try {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt(); // 문자열 입력 시 예외 발생
} catch (InputMismatchException e) {
System.out.println("정수를 입력해야 합니다.");
}
try {
int[] arr = new int[10];
arr[10] = 5; // 예외 발생
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스를 벗어났습니다.");
}
public void method() throws IOException {
// 예외 발생 코드