본문 바로가기

Java

[Java] 예외 Exception와 예외 처리

728x90

예외(Exception)란?

프로그램 실행 중 발생하는 이벤트로, 클라이언트(사용자)가 잘못된 조작을 하거나 개발자의 코드 실수로 인해 발생하여 프로그램 흐름을 방해하는 것을 말합니다.

예외 예시:

  1. 사용자의 잘못된 조작(잘못된 데이터 입력)
  2. 잘못된 연산 (예: n / 0)
  3. 잘못된 로직(코딩 실수)
  4. 시스템 과부화

오류와 에러의 차이점

오류(Error)는 시스템 레벨에서 발생하는 것으로, 개발자가 조치할 수 없는 수준을 의미합니다. 시스템이 종료되어야 할 수준의 상황이며, 개발자는 이를 미리 예측하여 방지해야 합니다.

자바에서 Error와 Exception의 공통점

public class Exception extends Throwable

public class Error extends Throwable

클래스 모두 Throwable을 상속받고 있습니다. Throwable은 예외와 오류의 최상위 클래스로, 프로그램의 흐름에 방해되는 모든 상황을 처리할 수 있습니다.

예외 종류

예외에는 크게 두 가지 종류가 있습니다:

  1. 일반 예외(Exception)
  2. 실행 예외(RuntimeException)

일반 예외(Exception)

일반 예외는 컴파일 시점에서 예외 처리 코드가 반드시 필요합니다.

이는 실행 예외를 제외한 모든 예외를 포함하며, 컴파일러가 예외 처리가 필요한지를 검사합니다.

실행 예외(RuntimeException)

실행 예외는 RuntimeException 클래스를 상속받은 예외로, 런타임 시점에서 발생하는 예외입니다.

실행 예외는 컴파일 시점에서 예외 처리 코드가 필요하지 않지만, 프로그램 실행 중에 발생할 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.

주요 차이점

  • 일반 예외: 컴파일러가 예외 처리를 강제합니다. 예를 들어, IOException, SQLException 등이 있습니다.
  • 실행 예외: 컴파일러가 예외 처리를 강제하지 않습니다. 예를 들어, NullPointerException, ArrayIndexOutOfBoundsException 등이 있습니다.

 

 

RuntimeException 대표적인 예외 종류

  1. NullPointerException (NPE)
    • 참조하는 객체 값이 없는(null) 상태에서 도트(.)을 사용했을 때 발생하는 오류입니다.
    public class Main {
        public static void main(String[] args) {
            String str = null;
            System.out.println(str); // 정상적으로 실행
            System.out.println(str.equals("test")); // NullPointerException 발생
        }
    }
  2. ArrayIndexOutOfBoundsException
    • 할당된 배열의 인덱스 범위를 초과했을 때 발생하는 오류입니다.
    public class Main {
        public static void main(String[] args) {
            int[] arr = {0, 1, 2, 3};
            System.out.println(arr[3]); // 정상적으로 실행
            System.out.println(arr[4]); // ArrayIndexOutOfBoundsException 발생
        }
    }
  3. NumberFormatException
    • 문자열로 되어있는 데이터를 숫자로 변경할 때 발생하는 오류입니다. 해당 데이터가 숫자가 아닌 문자를 포함할 때 발생합니다.
public class Main {
    public static void main(String[] args) {
        String a = "1234";
        String b = "abcd";

        int n1 = Integer.parseInt(a); // 정상적으로 변경
        int n2 = Integer.parseInt(b); // NumberFormatException 발생
    }
}

 

 

예외 처리 방법

  1. try-catch
    • 가장 대표적인 예외 처리 방법입니다. try {...} 블록에 예외가 발생할 수 있는 코드를 넣고, 예외가 발생하면 catch {...} 블록에서 처리합니다.
public class Main {
	
	public static void main(String[] args) {
		String a = "1234";
		String b = "abcd";
		
		int n1 = Integer.parseInt(a);
		int n2;
		try {
			n2 = Integer.parseInt(b);
		} catch (Exception e) {
			n2 = -1;
			System.out.println(e);
		}
		
		System.out.println("n1 : " + n1);
		System.out.println("n2 : " + n2);
	}
}

 

2. 예외 던지기 (throws)

  • 메서드 선언부에 throws 키워드를 사용하여 메서드가 예외를 던질 수 있음을 명시합니다. 이 방법은 메서드 내에서 발생한 예외를 호출한 메서드로 전달하는 역할을 합니다.

public class Main {
    public static void main(String[] args) {
        try {
            checkAge(-5);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void checkAge(int age) throws Exception {
        if (age < 0) {
            throw new Exception("나이는 음수일 수 없습니다.");
        }
    }
}

 

 

728x90

'Java' 카테고리의 다른 글

[Java] Arrays, Array 메소드 정리  (0) 2024.08.14
[Java] String 메소드 정리  (0) 2024.08.13
[Java] OOP 객체 지향 프로그래밍  (0) 2024.07.15
[Java] 배열  (0) 2024.07.09
[Java] 반복문 while 문  (0) 2024.07.05