Java

JAVA Error & Exception

차가운개발 2024. 12. 2. 22:42

 

Error와 Exception은 문제가 발생했음을 나타내는 객체다

 

ㅇ Error

애플리케이션 실행 중에 복구할 수 없는 심각한 문제를 나타낸다.

 

  • 개발자가 예외 처리(try-catch)로 복구할 수 없는 문제
  • JVM이나 시스템의 문제가 원인인 경우가 많음
  • ex 메모리 부족, 스택오버플로우 

주요 하위 클래스

  • OutOfMemoryError : 힙 메모리가 부족할 때 발생
  • StackOverflowError : 재귀 호출이 너무 깊어져 스택 메모리가 초과될 때 발생
  • NoClassDefFoundError : JVM이 필요한 클래스를 찾을 수 없을 때 발생

처리 방법 : 보통 에러는 애플리케이션 내에서 복구할 수 없으므로 예외 처리로 잡지 않고 프로그램을 중단하거나 로그를 남긴다.

public class ErrorExample {
	public static void main(String[] args) {
    	try {
        	rescursiveMethod(); // 스택오버플로우 발생
        } catch (StackOverflowError e) {
        	System.out.println("에러 발생: " + e.getMessage());
        }
    }
    
    public static void recursiveMethod() {
    	recursiveMethod(); // 무한 재귀 호출
    }
}

 

 

ㅇ Exception

프로그램 실행 중 발생할 수 있는 문제로 개발자가 처리할 수 있다

 

  • 예외는 보통 애플리케이션의 논리적 오류나 입력값 문제로 인해 발생한다
  • 개발자가 적절한 예외 처리를 비정상 종료를 방지하고, 안정적으로 실행되도록 하는 방법
  • 문제 원인을 확인하고 사용자가 이해할 수 있는 메세지 제공

종류

  • Checked Exception
    컴파일러가 예외 처리를 강제
    try-catch로 처리하거나 메서드 선언에 throws로 명시
    ex : IOException, SQLException
  • Unchecked Exception
    런타임에 발생하며,  컴파일러가 예외 처리를 강제하지 않음
    보통 프로그래머의 실수로 발생
    ex : NullPointerException, ArrayIndexOutOfBoundsException

처리방법 : try-catch 블록으로 처리하거나 throws 키워드로 호출자에게 예외를 넘김

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // ArithmeticException 발생
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }
}

try {
	// 예외 발생 가능 코드
} catch (예외타입 변수명) {
	// 예외 처리 코드
}

 

 

try-catch-finally

finally 블록은 예외 발생 여부와 상관없이 항상 실행된

try {
    // 예외 발생 가능 코드
} catch (예외_타입 변수명) {
    // 예외 처리 코드
} finally {
    // 항상 실행되는 코드
}

public class FinallyExample {
    public static void main(String[] args) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("file.txt"));
            System.out.println(reader.readLine());
        } catch (IOException e) {
            System.out.println("파일 읽기 중 예외 발생: " + e.getMessage());
        } finally {
            try {
                if (reader != null) reader.close();
            } catch (IOException e) {
                System.out.println("자원 닫기 중 예외 발생");
            }
        }
    }
}

 

throws

메서드가 예외를 처리하지 않고 호출한 쪽으로 예외를 위임한다

주로 Checked Exception을 메서드 선언부에 명시한다

public 반환타입 메서드명(매개변수) throws 예외_타입 {
    // 예외 발생 가능 코드
}


public class ThrowsExample {
    public static void main(String[] args) {
        try {
            readFile("nonexistent.txt");
        } catch (IOException e) {
            System.out.println("예외 처리: " + e.getMessage());
        }
    }

    public static void readFile(String filename) throws IOException {// 예외 위임
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        System.out.println(reader.readLine());
    }
}

 

throw

명시적으로 예외를 발생시킬 때 사용한다

예외 객체를 생성하여 던진다

throw new 예외_타입("예외 메시지");


public class ThrowExample {
    public static void main(String[] args) {
        try {
            validateAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }

    public static void validateAge(int age) {
        if (age < 18) {
            throw new IllegalArgumentException("나이는 18 이상이어야 합니다.");
        }
    }
}