예외와 예외 클래스
자바에서는 에러 이외에 예외(exception) 라고 부르는 오류가 있다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러가 동일하다. 그러나 예외는 예외처리(Exceptoin Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.
자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다.
예외는 두 가지 종류가 있다. 하나는 일반예외(Exception) 이고, 다른 하나는 실행 예외( Runtime Exception)이다.
▶ 일반 예외
컴파일러 체크 예외하고도 한다. 컴파일 하는 과정에서 예외 처리코드가 필요한지 검사한다. 만약 예외처리코드가 없다면 컴파일 오류가 발생한다.
▶ 실행 예외
컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다. 컴파일 시 예외 처리를 확인한다.
실행예외는 자바 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야한다.
개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료한다.
1. NullPointerException
객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생한다. 객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것이다.
public class NullPointerExceptionExample {
public static void main(String[] args }
String data = null;
System.out.println(data.toString());
}
}
data 변수는 null 값을 가지고 있기 때문에 String 객체를 참조하고 있지 않다. toString() 메서드를 호출하고 있기 때문에 NullPointerException 이 발생한다.
2. ArrayIndexOutOfBoundsException
배열에서 인덱스 범위를 초과하여 사용할 경우, 실행예외가 발생한다.
int[] arr = new int[3]
위의 코드처럼 3개의 배열을 선언했다면 배열 항목을 지정하지 위해 arr[0]~arr[2] 를 사용할 수 있다.
그렇지만 arr[3]을 사용하면 인덱스 범위를 초과했기 때문에 ArrayIndexOutOfBoundsException 가 발생한다.
3. NumberFormatException
문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 발생한다. 문자열을 숫자로 변환하는 방법은 여러가지가 있지만 가장 많이 사용되는 코드는 다음과 같다.
반환타입 | 메서드명(매개변수) | 설명 |
int | integer.parseInt(String s) | 주어진 문자열을 정수로 변환해서 리턴 |
double | Double.parseDouble(String s) | 주어진 문자열을 실수로 변환해서 리턴 |
이 클래스의 정적 메서드인 parseXXX() 메서드를 이용하면 문자열을 숫자로 변환할 수 있다.
이 메서드들은 매개값인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 포함되어 있다면 NumberFormatException 을 발생시킨다.
4. ClassCastException
타입 변환(Casting) 은 상위클래스와 하위 클래스간에 발생하고 구현 클래스와 인터페이스간에도 발생한다.
이러한 관계가 아니라면 클래스는 다른 클래스로 타입 변환할 수 없다. 억지로 타입 변환을 시도할 경우 ClassCastException 이 발생한다.
'java' 카테고리의 다른 글
java_12_예외처리2 (예외 처리 코드 ,다중catch ,catch순서,예외떠넘기기) (0) | 2021.10.24 |
---|---|
java_3_반복문(for문, while문, do-while문) (0) | 2021.10.23 |
java_ 3_조건문(if문, switch문) (0) | 2021.10.22 |
java_11_인터페이스 (0) | 2021.10.21 |
java_10_final & abstract (0) | 2021.10.21 |