Back-end/java

[혼공자][챕터10] 예외처리

Nellie Kim 2022. 12. 7. 11:00
728x90

1. 예외 클래스

예외란, 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는프로그램 오류.

자바는 예외가 발생할 가능성이 높은 코드를 컴파일 할 때 예외 처리 유무를 확인한다. 만약 예외 처리 코드가 없다면 컴파일이 되지 않는다.

 

 

예외의 두가지 종류

일반예외

- Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스

- 컴파일러 체크 예외 (컴파일러가 미리 체크를 해준다)

- 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다.

- 예외처리 코드가 없다면 컴파일 오류 발생.

실행예외

- RuntimeException의 하위 클래스

- 컴파일러 넌 체크 예외

- 실행 시 예측할 수 없이 갑자기 발생하기 때문에, 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.

- 실행예외는 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 작성해야 한다.

자바에서는 예외를 클래스로 관리한다. 

JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 

그 예외 객체를 예외처리코드에서 이용할 수 있도록 해준다.

모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.

 

실행예외의 종류

1. NullPointerException

가장 빈번하게 발생하며, 객체 참조가 없는 상태, 즉 null 값을 가지고 있는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을때 발생한다.

즉, 해당 객체가 null인 상태에서의 접근을 했을때 해당 값이 null에 대한 접근을 하여 발생하는 에러로 객체가 없는 상태에서 객체를 사용하려 하였으나 해당 객체는 없는 상태이기 때문에 발생하는 에러이다.

public class NullPointerExceptionExample {
	public static void main(String[] args) {
    	String data = null;
        System.out.println(data.toString());
    }
 }

 

2. ArrayIndexOutOfBoundsException

배열에서 할당된 배열의 인덱스 범위를 초과해서 사용할 경우 발생하는 에러입니다.

예를 들어 길이가 3인 int[] arr = new int[3] 배열을 선언했다고 가정하면  arr[0], arr[1], arr[2]

해당 배열에서 사용할 수 있는 인덱스의 범위로는 위의 arr[0], arr[1], arr[2]만을 사용할 수 있는데, arr[3]이나 arr[4]등 해당 인덱스의 범위에 벗어나는 경우에는 ArrayIndexOutOfBoundsException가 발생한다.

 

3. NumberFormatException

프로그램을 개발하다가 보면 문자열로 되어있는 데이터를 숫자로 변경하는 경우가 매우 자주 발생하곤 한다.

만약 parseXXX() 메소드들을 이용하여 문자열을 숫자로 변환할 수 있지만 매개변수로 오는 문자열이 숫자로 변환이 되는 값이면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 온다면 java.lang.NumberFormatException을 발생시킨다.

public class NumberFormatExceptionExample {
	public static void main(String[] args) {
    	String corretData = "100";  // 문자열 100은 숫자로 변환 할 수 있는 값이다.
    	String wrongData = "A100";  // 문자열 A100은 숫자로 변환 할 수 있는 값이다.
    	
    	int value1 = Integer.parseInt(corretData);
    	int value2 = Integer.parseInt(wrongData);
    	
    	System.out.println(value1);
    	System.out.println(value2);
    }
 }

4. ClassCastException

타입 변환(Casting)은 상위 클래스와 하위 클래스간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다.

이러한 관계가 아니라면 클래스는 다른 클래스를 타입으로 변환할 수 없다.

억지로 타입변환을 시도할 경우  ClassCastException이 발생한다.

public class ClassCastExceptionExample {
	static class Animal {}
	static class Dog extends Animal{}
	static class Cat extends Animal{}

	
	public static void main(String[] args) {
		// Dog 객체 생성
    	Dog dog = new Dog();
    	changeDog(dog);
    	
    	// Cat 객체 생성
    	Cat cat = new Cat();
    	changeDog(cat); 
    }
	public static void changeDog(Animal animal) {
		Dog dog = (Dog) animal; // ClassCastException 발생 가능
	}
}

changeDog에서 Cat에 대한 객체를 Dog 객체로 변환 하고자 할때 Dog 객체는 Dog객체로 캐스팅하여 할당하는 것이 가능하지만, Cat 객체는 Cat객체로서 Dog객체로서 억지로 형변환을 시도할때 ClassCastException에러가 발생할 수 있습니다.

 

 

 

출처 : 혼자 공부하는 자바