프로그램에서 오류가 발생하게 되면 원치않는 버그가 발생하거나 심한 경우 프로그램이 강제 종료되는 상황도 발생하게 됩니다.
오류는 내부적 요인과 외부적 요인을 통해 발생하고 프로그래밍에서 오류가 발생하는 이유는 크게 3가지로 분류 됩니다.
Compile Time Error
컴파일시 발생하는 오류
Runtime Error
실행 시 발생하는 오류
Logical Error
의도와 다르게 발생하는 논리적 오류
컴파일 단계에서 발생하는 에러로 컴파일러가 오류를 출력해줍니다.
주로 문법적 오류에 의해 발생하고 ;
이나 선언되지 않은 변수를 사용하게 되면 아래와 같이 에러가 발생했다고 알려줍니다.
컴파일오류는 실행전에 식별이 가능하기 때문에 개발 진행시 쉽게 해결이 가능합니다.
프로그램이 기획의도와 다르게 실행되는 오류로 "버그가 발생했다"라고 합니다.
논리적 오류는 컴파일/런타임 에러에서는 제대로 동작되기 때문에 쉽게 식별하지 못하고 개발자가 실행 결과를 통해 판단하거나 테스트 코드를 통해 로직을 확인하며 개발을 진행해야 합니다.
프로그램 실행중 발생하는 "실행 오류"입니다.
컴퍼일러에 의해 식별되지 않거나 실행중 로직 설계 오류로 발생하는 에러입니다.
Java에서는 Runtime Error를 2가지로 분류해 처리하는데 분류기준은 다음과 같습니다.
Error는 주로 메모리 부족이나 오버플로우등이 발생하면 JVM에 의해 식별되기 때문에 미연에 방지하거나 대처가 불가능한 오류들을 말하며,
Exception은 로직의 오류에 의해 발생하게 되며 "예외처리"를 통해 비정상적인 종료를 방지 가능합니다.
Java에서 예외처리는 Try-Catch문
& Throws
를 사용하여 처리합니다.
Java의 최상위 클래스 Object
를 상속받아 Throwable
클래스를 통해 다양한 예외클래스 들이 계층 구조를 이루고 있습니다.
출처 : https://rollbar.com/blog/java-exceptions-hierarchy-explained/
예외 타입 | 설명 |
---|---|
ArithmeticException | 어떤 수를 0으로 나누는 것과 같이 비정상 계산 중 발생 |
NullPointerException | NULL 객체 참조 시 발생 |
IllegalArgumentException | 메소드의 전달 인자값이 잘못된 경우 발생 |
IllegalStateException | 객체의 상태가 메소드 호출에는 부적합한 경우 발생 |
IndexOutOfBoundsException | index 값이 범위를 넘어갈 경우 발생 |
UnsupportedOperationException | 객체가 메소드를 지원하지 않은 경우 발생 |
SecurityException | 보안 위반 발생 시 보안 관련 프로그램에서 발생 |
ProviderException | 구성 공급자 오류 시 발생 |
NoSuchElementException | 구성 요소가 더 이상 없는 경우 발생 |
ArrayStoreException | 객체 배열에 잘못된 객체 유형 저장 시 발생 |
ClassCastException | 클래스 간의 형 변환 오류 시 발생 |
EmptyStackException | 스택이 비어있는데 요소를 제거하려고 할 시 발생 |
null
객체에 접근해 호출하는 경우 발생하는 예외예외 타입 | 설명 |
---|---|
IOException | 입출력 작업 중 발생하는 일반적인 예외 (파일 읽기/쓰기 등) |
FileNotFoundException | 파일을 찾을 수 없을 때 발생 (IOException의 하위 클래스) |
SQLException | 데이터베이스 작업 중 발생하는 예외 |
ClassNotFoundException | 클래스 파일을 로드할 수 없을 때 발생 |
InterruptedException | 스레드가 실행을 기다리는 중 인터럽트가 발생할 때 발생 |
MalformedURLException | 잘못된 URL 형식일 때 발생 |
UnknownHostException | 잘못된 호스트 이름을 사용하거나 호스트를 찾을 수 없을 때 발생 |
CloneNotSupportedException | 객체가 Cloneable 인터페이스를 구현하지 않았을 때 복제 시도 시 발생 |
InstantiationException | 추상 클래스나 인터페이스를 인스턴스화하려고 할 때 발생 |
NoSuchMethodException | 호출하려는 메서드가 존재하지 않을 때 발생 |
IllegalAccessException | 클래스나 메서드에 접근할 수 없는 경우 발생 |
Exception은 "예외처리 필수 유무"에 따라 한번더 분류를 진행합니다.
반드시 예외처리를 해야하는 경우는 Checked
로 아닌 경우에는 UnChecked
로 분류됩니다.
구분 | Checked Exception | Unchecked Exception |
---|---|---|
처리 의무 | 반드시 처리 (컴파일 단계에서 강제) | 선택적 처리 (처리하지 않아도 실행 가능) |
발생 시점 | 컴파일 단계 | 실행 단계 |
대표 예시 | IOException, SQLException | NullPointerException, ArithmeticException |
예외 처리 방식 | try-catch 또는 throws | 선택적으로 try-catch 사용 |
Java에서 예외처리는 Try-Catch
를 사용하여 로직을 감싸서 개발자가 직접 예외처리를 진행하는 방법과 Throws
를 사용해 클래스 단에서 상위클래스로 예외처리를 위임하는 방법이 있습니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryCatchExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line = reader.readLine();
System.out.println("파일 내용: " + line);
reader.close();
} catch (IOException e) {
System.out.println("IOException 발생: 파일을 읽을 수 없습니다.");
e.printStackTrace();
}
}
}
try-catch
보다는 깔끔하지만 외부에서 처리하기 때문에 처리 결과를 사용자화 하기 어려움import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ThrowsExample {
public static void main(String[] args) {
try {
readFile();
} catch (IOException e) {
System.out.println("IOException 발생: 파일을 읽을 수 없습니다.");
e.printStackTrace();
}
}
public static void readFile() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line = reader.readLine();
System.out.println("파일 내용: " + line);
reader.close();
}
}
https://rollbar.com/blog/java-exceptions-hierarchy-explained/
https://www.w3schools.com/java/java_ref_errors.asp