모든 Error와 Exception은 java.lang.throwable에 의해 만들어집니다.

Exception은 Cheched Exception(일반 예외)과 Runtime Exception(실행 예외)이 있는데, 

Checked Exception은 컴파일러가 사용자에게 알려주지만 RuntimeException은 관여하지 않기 때문에 유의해야 합니다.

 

 


 

□ Runtime Exception

Runtime Exception은 Exception 처리 코드를 생략하더라도 컴파일이 되는 Exception을 뜻합니다.

 

다음은 Runtime Exception의 대표적인 종류입니다.

 

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • ClassCastException
  • NumberFormatException

 


 

1. NullPonterException

NullPonterException은 객체 참조가 없는 상태에서의 Exception입니다.

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

 

다음은 예시 코드입니다.

 

@Log4j2
public class NullPointerException {

	
    public static void main(String[] args) {
//      String data = null;
//      log.info(data.toString());
		
    } // main
    
} // end class

 

위의 코드를 실행하면 아래와 같은 오류 코드가 발생합니다.

 

NullPointerException

 

첫번 째 줄에서 왼쪽은 Exception 이름, 오른쪽은 Exception이 발생하게 된 이유입니다.

두번 째 줄은 Stack Trace입니다.

Stack Trace은 프로그램의 실행 경로를 역순으로 나열해서 콘솔 뷰에서 보여주는데,

Bottom-Up으로 읽은게 일반적이며, Runtime Exception을 처리할 때 사용됩니다.

 

 

 

2. ArrayIndexOutOfBoundsException

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

 

다음은 예시 코드입니다.

@Log4j2
public class ArrayIndexOutOfBoundsException {

	
    public static void main(String[] args) {
        if(args.length == 2) {
            String data1 = args[0];
            String data2 = args[1];
            String data3 = args[2];
			
            log.info("args[0] : ", data1);
            log.info("args[1] : ", data2);
            log.info("args[2] : ", data3);
        } else {
            log.info("[ 실행 방법 ]");
            log.info("java ArrayIndexOfBoundsException   ");
            log.info("값1 값2");
        } // if - else
		
    } // main
	
} // end class

 

args의 배열 길이가 2일 경우에만 log.info로 출력하게 하였고,

그 외의 경우는 실행 방법을 출력해서 예외 처리를 하였습니다.

 

위의 코드를 컴파일할 경우 다음과 같은 오류 코드가 발생합니다.

 

ArrayOutOfBoundsException

 

 

 

3.ClassCastException

ClassCastException은 타입 변환이 되지 않을 경우 발생합니다.

 

다음은 예시 코드입니다.

 

 

@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{;;}

 

Animal 부모 클래스를 생성하고, 

Animal 클래스를 extends하는 Dog, Cat클래스를 각각 생성합니다.

실행 클래스에서 Dog와 Cat의 인스턴스를 생성하고 changeDog 메서드를 호출해서 타입변환을 시도합니다.

changeDog 메서드는 Animal 타입의 파라미터를 받고 각 파라미터의 타입을 instanceof로 비교해서 맞는 타입으로 변환합니다.

 

위의 코드는 문제가 없지만 만약 Cat으로 변환하는 else가 없다면 ClassCastException이 발생합니다.

 

ClassCastException

 

ClassCastException이 발생할 경우 IlleageArgumentException을 발생시켜 값이 잘못 들어왔음을 알려줍니다.

 

 

 

4. NumberFormatException

NumberFormatException은 데이터 타입의 타입 변환이 불가할 때 발생합니다.

 

다음은 예시 코드입니다.

 

@Log4j2
public class NumberFormatException {
	
	
    public static void main(String[] args) {
        // 최초 입력 데이터는 문자열
        String data1 = "100";
        String data2 = "a100";
		
        // 위의 문자열 중, 숫자 형태의 문자열을 Int타입으로 변경
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);
		
		
        int result = value1 + value2;
        log.info("{} + {} + = {}", data1, data2, result);
    } // main
	
} // end class

 

위의 코드를 실행시키면 NumberFormatException이 발생합니다.

 

NumberFormatException

 

a100에 문자 'a'가 있기 때문에 NumberFormatException이 발생했으며, 콘솔에서도 확인할 수 있습니다.

 

 

 

 

 

 

'Java' 카테고리의 다른 글

보조 스트림  (0) 2023.08.17
파일 클래스  (0) 2023.08.17
Exception  (0) 2023.07.27
익명구현객체  (0) 2023.07.26
인터페이스 다중 상속  (0) 2023.07.26

+ Recent posts