예외라는 것은 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다. 예외가 발생되면 프로그램이 종료가 될 수도 있는데 예외처리를 통해 프로그램을 종료하지 않고 정상 실행상태가 유지되도록 할 수 있다.
예외에는 2가지 종류가 있다. 일반적인 예외(Exception)와 실행 예외(Runtime Exception)이다. 일반 예외는 컴파일러 체크 예외라고도 한다. 실행예외는 컴파일 하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다. 자바에서는 예외를 클래스로 관리한다.
다음은 예외 클래스를 보여준다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속 받는다.
위 그림을 보면 맨 위에 java.lang.Exception 클래스가 존재한다. 그 밑에 ClassNotFoundException, InterruptedException 과 RuntimeExcpetion이 존재한다. 앞 2 클래스는 일반적인 예외 클래스이고 Runtime은 실행 예외 클래스이다.
실행 예외(RuntimeException) 클래스는 다음과 같이 나누어진다.
등이 존재한다. 대표적인 것이 위에 써놓은 클래스들이다.
NullPointerException은 객체 참조가 없는 상태를 말한다. 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생한다.
String s =null;
System.out.println(s.toString()); 과 같을 때 예외가 발생한다.
ArrayIndexOutOfBoundsException은 배열에서 인덱스 범위를 초과하여 사용할 경우 발생하는 예외이다.
int[] arr = new int[3];
이면 인덱스는 0~2까지이다.
여기서 arr[3]에 접근하면 해당 예외가 발생한다.
ClassCastException은 타입 변환(Casting)은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다.
위 경우에서
Animal ani = new Dog()와 같은 타입 변환은 가능하다.
하지만
Cat cat = (cat) ani;
와 같은 경우엔 타입 변환 허용이 안되기 때문에 ClassCastException 예외가 발생한다.
NumberFormatException 클래스는 문자열로 되어있는 데이터를 숫자로 변경할 때 나오는 예외이다.
문자열을 int로 변경하려면 Integer.parseInt(String s)
문자열을 double로 변경하려면 Double.parseDouble(String s)
처럼 바꿀 수 있다.
근데 String s = "100"; 이면 숫자형태로 변경이 가능하지만
String s= "a100"; 은 숫자형태로 변경이 불가능하다. 이럴때 예외가 발생한다.
ArithmeticException은 수학과 관련되어 나오는 예외이다.
예를들어 3 / 0 은 0으로 나눌 수 없으니 이럴때 발생하는 예외이다.
StringIndexOutOfException은 문자열 인덱스와 관련된 에러이다.
문자열 영역에서 초과되는 영역에 접근 할 경우 발생되는 예외이다.
예외 처리 코드는 다음과 같은 문법으로 작성된다.
try 영역에는 예외 발생 가능 코드가 위치한다. try가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행한다. 만약 예외가 발생되면 catch 영역을 실행하고 finally를 실행한다.
finally영역은 무조건 실행하는 영역인데 중간에 return이 있더라도 이 finally영역은 무조건 실행한다. 이 영역은 생략이 가능하다.
그리고 catch는 다중 catch를 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static void main(String[] args) { String[] a = {"aa"}; String data = null; try{ Class c = Class.forName("java.lang.test"); //클래스 못찾는 에러 System.out.println(data.toString()); //null 에러 String data1 = a[0]; //String data2 = a[1]; int v = Integer.parseInt(data1); } catch(ArrayIndexOutOfBoundsException | NumberFormatException e) { System.out.println("매개변수 개수가 부족합니다."); } catch(Exception e) { System.out.println("에러"); } finally { System.out.println("다시 실행하세요"); } } Colored by Color Scripter |
위 소스를 보면 catch문 하나에는 | 연산자로 배열과 숫자 변환 예외와 관련된 catch문을 넣었다. 또한 밑에는 예외 최상위 Exception 클래스를 catch로 두었다. 이렇듯 다중 catch를 이용해 여러 오류를 따로따로 잡을 수 있다.
근데 여기서 catch순서가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
catch(Exception e) { System.out.println("매개변수 개수가 부족합니다."); } catch(ArrayIndexOutOfBoundsException) { System.out.println("에러"); } Colored by Color Scripter |
만약 catch가 위와 같은 순서로 되어 있으면 Exception이 제일 상위 클래스 이기 때문에 밑에 있는 ArryIndexOutOfBoundsException은 실행되지 않는다.
throws 등의 예외 떠넘기기는 다음 페이지에서 진행하겠다.
'java' 카테고리의 다른 글
자바 패키지(lang, util) (0) | 2017.08.17 |
---|---|
자바 예외 처리(try catch), throws, throw, 사용자 정의 예외 클래스 (0) | 2017.08.17 |
자바 중첩 인터페이스, 익명 인터페이스(익명 객체) (0) | 2017.08.17 |
중첩 클래스, 내부 클래스(inner class, nested class), 로컬 클래스 (0) | 2017.08.16 |
자바 인터페이스 - 2 (0) | 2017.08.16 |