예외는 CheckecdException(일반 예외)와 RuntimeException(실행 예외)가 있습니다.

RuntimeException은 Exception에 포함되어 있지만

컴파일러는 RuntimeException에 개입하지 않습니다.

 

 


ChechedException은 체크를 당하는 예외이며 컴파일 당하게 됩니다. 

대표적인 일반 예외는 다음과 같습니다.

java.lang.ClassNotFoundException

java.lang.InterruptedException

 

RuntimeException은 컴파일이 체크에 개입하지 않습니다. 정확히는 컴파일러가 예외를 무시하게 됩니다.

대표적인 실행 예외는 다음과 같습니다.

java.lang.NullPointerException

java.lang.ArrayIndexOutOfBoundsException

java.lang.ClassCastException

java.lang.NumberFormatException

 

 


 

1. NullPointException

객체 참조가 없는 상태, null 값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다.

 

NullPoinException

 

NullPointException-consoleView

 

첫 줄을 보시면 예외의 타입, 예외의 원인을 보여주고 있습니다.

 

두번째 줄은 stacktrace입니다.

stacktrace는 시스템에서 보내는 오류 메세지인데, 예외가 발생한 시점에서의 메소드 호출 스택을 보여줍니다.

stacetrace가 길어지면 호출의 흐름을 Bottom-Up으로 읽는게 일반적입니다.

그렇다면 위의 메세지에서의 메소드 호출 스택은 "NullPointerException.java:12" 이 됩니다.

즉, "data"가 "null"이므로 String.toString()을 invoked(호출)할 수 없다는 뜻입니다.

 

 

 

2.  ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과해서 사용할 경우 발생합니다.

 

ArrayIndexOutOfBoundsException

 

Run Configuration에서 args에 값을 넣어주지 않으면 else에서 예외를 처리하게 됩니다.

 

ArrayIndexOutOfBoundsException 발생

 

args에 값을 할당하게 되면 정상적으로 동작합니다.

 

 

 

3. ClassCastException

형 변환이 잘못되었을 때 발생합니다.

 

ClassCastException

 

위의 코드에서 Dog 타입의 dog를 changeDog 메서드의 Animal 타입 파라미터로 던져주고,

changeDog 메서드는 instanceof로 받은 파라미터가 Dog 타입인지 확인합니다.

이후 Dog 타입이면 animal 타입의 파라미터인 dog를 Dog타입으로 강제 형 변환합니다.

 

만약 Cat 타입의 cat 객체가 changeDog 메서드의 파라미터로 던져지게 되면, instanceof에서 필터링하고

changeDog 메서드에서 cat의 강제 형변환이 실행되지 않게 됩니다.

 

만약 cat도 강제 형 변환을 하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.

@Log4j2
public class ClasscastException {

    public static void main(String[] args) {
        Dog dog = new Dog();
        ClasscastException.chageDog(dog);
		
        Cat cat = new Cat();
        ClasscastException.chageDog(cat);
		
    } // main
	
	
    public static void chageDog(Animal animal) {
        if(animal instanceof Dog) {
            Dog dog = (Dog) animal; // ClassCastException 발생 가능
        } else if(animal instanceof Cat) {
            Cat cat = (Cat) animal;
        } else {
            throw new IllegalArgumentException(String.format("값이 잘못 들어왓습니다."));
        }
		
    } // changeDog

} // end class

class Animal{;;}
class Dog extends Animal{;;}
class Cat extends Animal{;;}

 

 

 

4. NumberFormatException

 

NumberFormatException

data1은 문자열 타입의 숫자라서 Integer.parseInt로 타입 변환이 가능하지만,

data2는 문자 a가 섞여 있어서 Int로의 타입 변환이 불가능합니다.

 

위 코드를 실행하면 다음과 같은 오류 메세지가 출력됩니다.

NumberFormatException

 

 

 


 

 

이러한 Eception들은 try-catch-finally 블록을 이용해서 Exception 코드를 처리할 수 있습니다.

'Java' 카테고리의 다른 글

파일 클래스  (0) 2023.08.17
Exception Handling  (0) 2023.07.28
익명구현객체  (0) 2023.07.26
인터페이스 다중 상속  (0) 2023.07.26
패턴 매칭 연산자  (0) 2023.07.26

+ Recent posts