[혼공자] - 예외 클래스

SGIYLEVOELR·2022년 1월 29일
0

혼공자

목록 보기
3/6

일반 예외 ( == 컴파일러 체크 예외 )

  • 프로그램 실행 시 예외가 발생할 가능성이 높음.
  • 따라서, 프로그램 실행 전 자바 소스 컴파일 시 예외 처리 코드가 있는 지 검사.

프로그램 실행 -- 예외 발생!!
이를 방지하기 위하여,

  • 소스 --컴파일--> 프로그램 실행이라는 일련의 과정이 진행되는 동안...
    컴파일 과정에서 미리 예외 처리 코드를 검사.

실행 예외 ( == 컴파일러 넌 체크 예외 )

  • 실행 시 예측할 수 없이 나타나는 예외.
  • 따라서, 컴파일 시 예외 처리 코드가 있는 지 검사X

예외

1. NullPointerException

  • 가장 많이 보는 예외인 듯 (그래서 다른 것보다 명확하게 정리함..)
  • java.lang.NullPointerException
  • null값(즉, 값 자체가 없는 상태)을 사용하려고 할 때 발생

확인

  • NullPointerException이 일어날 수 있는 상황은?
    public class NullPointerExceptionExample {
        public static void main(String[] args) {
            String data = null;
            System.out.println(data.toString());
        }
    }

결과

  • main method에서 NullPointerException이 발생했다!

2. ArrayIndexOutOfBoundsException

  • 배열에서 인덱스 범위를 초과할 경우 나타나는 예외

예시

public class ArrayIndexOutOfBoundsExceptionExample {
    public static void main(String[] args) {
        String data1 = args[0];
        String data2 = args[1];

        System.out.println("args[0]: " + data1);
        System.out.println("args[1]: " + data2);
    }
}

결과

  • args라는 변수에 값이 담아있지 않기 때문에 애초에 data1, data2의 값이 나올 수 없다...?

3. NumberFormatException

  • 변수에 들어있는 값을 숫자로 변환할 때 생기는 에러로.. 숫자로 변환 불가능한 문자가 들어있을 때 나는 에러.

예시

public class NumberFormatExceptionExample {
    public static void main(String[] args) {
        String data1 = "100";
        String data2 = "a100";

        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);

        int result = value1 + value2;
        System.out.println(data1 + " + " + data2 + " = " + result);
    }
}

결과

4. ClassCastException

예시

public class ClassCastExceptionExample {
    public static void main(String[] args) {
        Dog dog = new Dog();
        changeDog(dog);

        Cat cat = new Cat();
        changeDog(cat);
    }

    public static void changeDog(Animal animal) {
        // if(animal instanceof Dog) {
            Dog dog = (Dog) animal;
        // }
    }
}

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

결과

  • changeDog(cat) 부분에서 매개변수를 cat으로 받는 changeDog 함수가 실행.
  • 실행될 경우의 코드는 Dog dog = (Dog) cat;이 된다.
  • 이 때, Cat() 함수는 Cast를 Dog() 함수로 했기 때문에 Cast Error가 난다.

일반 예외와 실행 예외 구분 방법

일반 예외

  • java.lang.RuntimeException의 하위 클래스 X

실행 예외

  • java.lang.RuntimeException의 하위 클래스
  • <상속> 관계 -- 부모에 RuntimeException 존재

예외 처리

try - catch 구문


P.512 8번

public class IntegerCompareExample {
    public static void main(String[] args) {
        Integer obj1 = 100;
        Integer obj2 = 100;
        Integer obj3 = 300;
        Integer obj4 = 300;

        System.out.println(obj1 == obj2); // true
        System.out.println(obj3 == obj4); // false
    }
}
  • 분명 값도 동일하고 연산자도 동일하기 때문에 둘 다 true가 나오거나 혹시 틀리다면 둘 다 false가 나오는 게 맞는 거 같다..
  • 하지만, 결과는 각각 true, false이다.

이는 Integer, int의 속성...? 때문인데..

  • Integer 변수를 ==연산자로 비교할 때에는 주소값을 비교하기 때문에 결과값은 둘 다 false가 나와야 한다..
  • 하지만, 이 때 int의 속성으로 -128 ~ 127까지의 값은 ==연산자를 사용할 경우 값 자체로 비교를 하게 된다.
  • 따라서 127이하인 100의 값을 가지고 있는 obj1, obj2는 값 자체를 비교하여 true가..
  • 128이상인 obj3, obj4는 주소를 비교하여 false가 나오게 되는 것이다.

예시

public class IntegerCompareExample01 {
    public static void main(String[] args) {
        Integer obj1 = 100;
        Integer obj2 = 100;
        Integer obj3 = 127;
        Integer obj4 = 127;
        Integer obj5 = 128;
        Integer obj6 = 128;

        System.out.println(obj1 == obj2);
        System.out.println(obj3 == obj4);
        System.out.println(obj5 == obj6);
    }
}

위의 예시에 대한 결과
obj1, obj2, obj3, obj4는 127이하의 값이기 때문에 ==연산자로 비교 시 true가
obj5, obj6은 128 이상의 값이기 때문에 ==연산자로 비교 시 false가 나온다.

Wrapper Class

0개의 댓글