본문 바로가기

Java

예외 : 예외와 예외 클래스

컴퓨터의 오동작 또는 고장으로 인해 오류 발생 → 에러 사용자의 잘못된 조작, 개발자의 잘못된 코딩 → 예외

예외에는 "일반 예외"와 "실행 예외" 두 가지 종류가 있다. 일반 예외는 컴파일러 체크 예외라고도 부름. 컴파일 과정에서 예외 처리 코드가 필요한지 검사하기 때문 실행 예외는 JVM이 프로그램을 실행하는 도중 예외 발생하면 예외가 발생한다.

자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성하고, 이를 활용해서 예외 처리를 해준다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속 받는다.

실행 예외

실행 예외는 컴파일러가 체크해주지 않음. 자주 발생되는 예외를 눈에 익혀두면, 어떤 예외가 있는지 체크하는데 도움이 될 것!

NullPointerException

null값을 갖는 참조 변수를 사용하려고 했을 때.

안에 객체가 없는데 쓰려고 접근하니까 예외 발생

String data = null;
System.out.println(data.toString());
// data에 아무것도 없다. 근데 참조? 예외 발생.

ArrayIndexOutOfBoundsException

배열 인덱스 범위 초과해서 사용할 경우 예외 발생한다.

int intArray = [1, 2];

System.out.println(intArray[0]);
System.out.println(intArray[1]);
System.out.println(intArray[2]); // index 2에 값이 없다.

ArrayIndexOutOfBoundsException이 발생하지 않게 하려면, 값을 읽기 전에 배열의 길이를 먼저 조사하는 것이 좋다.

NumberFormatException

숫자 포맷이 맞지 않다. 문자열로 되어 있는 데이터를 숫자로 변경하는 경우 자주 발생한다.

Integer.parseInt(String s) : 주어진 문자열을 정수로 변환해서 리턴 Double.parseDouble(String s) : 주어진 문자열을 실수로 변환해서 리턴

String data1 = "100";
String data2 = "a100";

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

ClassCastException

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

이 외 타입 변환이 안 되는 경우인데, 타입 변환 시도 할 경우 ClassCastException이 발생한다.

이런클래스의 상속 관계와 구현 관계가 있다고 해보자.

Animal animal = new Dog();
Dog dog = (Dog) animal;

RemoteControl rc = new Television();
Television tv = (Television) rc;

해당 경우는 아무런 문제가 없다. 하지만 만약 이렇게 한다면?

Animal animal = new Dog();
Cat cat = (Cat) animal;

RemoteControl rc = new Television();
Audio audio = (Audio) rc

안 된다. 이 때 ClassCastException이 발생한다. 그래서 타입 변환 전에 타입 변환 가능한지 instanceof 연산자로 확인하는 게 좋다.

Animal animal = new Dog();
if(animal instanceof Dog){
	Dog dog = (Dog) animal;
}else if(animal instanceof Cat){
	Cat cat = (Cat) animal;
}

Remocon rc = new Audio();
if(rc instanceof Television){
	Television tv = (Television) rc;
}else if(rc instanceof Audio){
	Audio audio = (Audio) rc;
}

반응형

'Java' 카테고리의 다른 글

예외 : try-with-resource  (0) 2021.03.25
예외 : try-catch-finally  (0) 2021.03.25
어노테이션(Annotation)  (0) 2021.03.11
static과 싱글톤  (0) 2021.03.11
상속 : 추상 클래스  (0) 2021.03.07