📌 Error(오류)
시스템이 종료되어야 할 수준의 수습하기 힘든 심각한 문제를 의미한다.
=> 컴파일 시 문법적인 오류와 런타임 시 널포인트 참조와 같은 오류로 프로세스에 심각한 문제를 야기시켜 프로세스를 종료시킬 수 있다.
📌 Exception(예외)
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 의미한다.
=> 컴퓨터 시스템의 동작 도중 예기치 않았던 이상 상태가 발생하여 수행 중인 프로그램이 영향을 받는 것이다.
프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우를 프로그램 오류라 하고, 프로그램 오류는 에러(Error)와 예외(Exception) 두 가지로 구분할 수 있다.
Error는 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이다. 에러는 JVM 실행에 문제가 생긴 것이므로 개발자가 대처할 방법이 없고, 미리 예측하여 방지할 수 밖에 없다.
반면 Exception은 발생하더라도 수습될 수 있는 비교적 덜 심각한 오류이다. 예외는 에러와 달리 문제가 발생하더라도 예외처리(Exception Handling)을 통해 프로그램의 비정상적인 종료 혹은 동작을 막을 수 있다.
자바에서는 try-catch문으로 예외 처리를 할 수 있다.

오류와 예외 모두 자바의 최상위 클래스인 Object를 상속받고, 그 사이에는 Throwable 클래스와 상속관계가 있다.
Throwable 클래스는 오류나 예외에 대한 메시지를 담는다.
대표적으로 getMessage()와 printStackTrace()라는 메소드가 속해 있는데, 당연히 Throwable을 상속받은 Error와 Exception에서도 위 메소드를 사용할 수 있다.

Error는 시스템 레벨에서 발생하여, 개발자가 어떻게 조치할 수 없는 수준을 의미한다.
StackOverflowError
응용 프로그램이 너무 많이 반복되어 StackOverflow가 발생할 때 던져지는 오류
OutOfMemoryError
JVM이 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을 때 던져지는 오류
힙 사이즈 부족, 너무 많은 class를 로드, 가용가능한 swap이 없을 때, 큰 메모리의 native 메소드가 호출될 때 등
=> 이를 해결하기 위해 dump 파일분석, jvm 옵션 수정

예외는 개발자가 구현한 로직에서 발생하며 개발자가 다른 방식으로 처리가능한 것들로 JVM은 정상 동작한다.
NullPointerException
Null 레퍼런스를 참조할 때 발생
IndexOutOfBoundsException
배열과 유사한 자료구조(문자열, 배열, 자료구조)에서 범위를 벗어난 인덱스 번호 사용으로 발생
FormatException
문자열, 숫자, 날짜 변환 시 잘못된 데이터로 발생하며, 보통 사용자의 입력, 외부 데이터 로딩, 결과 데이터의 변환 처리에서 자주 발생
ArthmeticException
정수를 0으로 나눌때 발생
ClassCastException
변환할 수 없는 타입으로 객체를 변환 시 발생
IllegalArgumentException
잘못된 인자 전달 시 발생
IOException
입출력 동작 실패 또는 인터럽트 시 발생
IllegalStateException
객체의 상태가 매소드 호출에는 부적절한 경우에 발생
ConcurrentModificationException
금지된 곳에서 객체를 동시에 수정하는것이 감지될 경우 발생
UnsupportedOperationException
객체가 메소드를 지원하지 않는 경우 발생
Java에서 모든 예외가 발생하면 (XXX)Exception 객체를 생성한다.
예외를 처리하는 방법에는 크게 2가지가 있다.
// try - catch 로 예외처리
public static void fileOpen() {
// 파일을 열고 쓰고 닫는 아주 단순한 로직이어도
// 이에 대한 예외는 checked exception으로 분류 되기 때문에
// 반드시 try - catch로 감싸주어야 한다.
try {
FileWriter file = new FileWriter("data.txt");
file.write("Hello World");
file.close();
} catch(IOException e) {
e.printStackTrace();
}
}
// ---------------------------------------------------------
// throws 로 예외처리
public static void fileOpen() throws IOException {
// 파일을 열고 쓰고 닫는 아주 단순한 로직이어도
// 이에 대한 예외는 checked exception으로 분류 되기 때문에
// 반드시 try - catch로 감싸주어야 한다.
FileWriter file = new FileWriter("data.txt");
file.write("Hello World");
file.close();
}