오류(error)와예외(exception)모두 시스템 상에서 프로그램에 문제가 발생해 실행중인 프로그램이 종료되는 것이다.
✅ 에러(error)는 예측해서 처리하는게 불가능하고 예외(exception)는 예측해서 처리하는게 가능하다.

| 클래스명 | 발생 상황 |
|---|---|
| ArithmeticException | 0으로 나누는 경우 발생 |
| ArrayIndexOutOfBoundsException | 배열의 index 범위를 넘어서 참조하는 경우 발생 |
| NullPointerException | 객체가 참조되지 않는 상태(Null)로 객체에 접근하는 경우 발생 |
| ClassCastException | 형 변환 시 문제가 있을 경우 발생 |
| NegativeArraySizeException | 배열의 크기를 음수로 지정한 경우 발생 |
throw
: 개발자가 자신의 의도와 다른 경우고의로 예외를 발생시키는 것으로 컴파일 문제는 발생하지 않음
throws
: 메소드 내에서 예외처리를 하지 않고 해당 메소드를 사용한 곳에서 예외 처리를 하도록전달하는 것
throw를 통해 예외 발생시키기throws를 통해 예외를 메소드를 호출하는 메소드에게 전달하기⁉️ main에서 throws를 하면 어떻게 될까?
위에서 'throws'를 통해 예외를 메소드를 호출한다고 했다. 그렇다면 가장 마지막에 있는 main 메소드에서 thorws 처리를 하면 어떻게 될까? 이 경우에서는 JVM에서 예외 처리를 해 예외 내용을 console에 출력한다.
참고로 main 메소드에서 throws Exception을 붙이는 것은 좋지 않은 방법이니 지양하는 것이 좋다.
/* 1. Test.java */
public class Test {
// 메서드가 예외 처리를 직접 하지 않고 호출한 쪽으로 예외를 전달
public void checkEnoughMoney(int price, int money) throws Exception {
if (money >= price) {
System.out.println("상품을 구매할 수 있습니다.");
} else {
// 예외를 발생시켜 호출한 쪽에서 처리하도록 함
throw new Exception();
}
}
}
/* 2. Application.java */
public class Application {
public static void main(String[] args) {
Test test = new Test();
// 호출한 쪽에서 전달받은 예외를 처리
try {
test.checkEnoughMoney(10000, 50000);
test.checkEnoughMoney(60000, 50000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
발생한 Exception을 직접 처리하는 방법
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
try{
// ArithmeticException 예외가 발생할 수 있는 부분 (b가 0일수도)
int result = a/b;
System.out.println(result);
}catch(ArithmeticException e){
// 예외가 발생했을 때 실행하고자 하는 부분
System.out.println("0으로는 나눌 수 없습니다.");
// 어떤 예외가 발생했는지 알려주는 메소
e.printStackTrace();
}finally {
// 예외 발생 여부에 상관 없이 무조건 실행하는 부분
System.out.println("입력한 숫자 : " + a + " , " + b);
}
}
}
입출력에서 사용되는 스트림의
자원 반납을 finally 블럭을 사용하지 않고 용이하게 처리하기 위해 자바 7버전부터 추가된 문법
public class Test{
public static void main(String[] args) {
/* 자원을 반납 해야 하는 인스턴스를 try 옆 소괄호에서 생성하면
* 해당 블럭 종료 시 자동 close 작업이 일어난다. */
try (BufferedReader in = new BufferedReader(new FileReader("test.dat"));){
String s;
while((s = in.readLine()) != null){
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}