예외 & 예외처리란?
예외(Exception): 프로그램에 문제가 있는 것.
예외처리(Exception handling): 예외로 인해 시스템 동작이 멈추는 것을 막는 것
계층구조
계층구조 - Throwable 클래스
Throwable 클래스: 모든 예외의 조상이 되는 Exception 클래스와 모든 오류의 조상이 되는 Error 클래스의 부모 클래스
-이 클래스에는 예외나 오류에 관한 다양한 정보를 확인할 수 있는 다음과 같은 메소드가 포함됨
메소드 | 설명 |
---|---|
String getMessage() | 해당 throwable 객체에 대한 자세한 내용을 문자열로 반환함. |
void printStackTrace() | 해당 throwable 객체와 표준 오류 스트림(standard error stream)에서 해당 객체의 스택 트레이스(stack trace)를 출력함. |
String toString() | 해당 throwable 객체에 대한 간략한 내용을 문자열로 반환함. |
계층구조 - Exception 클래스의 두 하위클래스
1. RuntimeException 클래스
2. 그 외의 Exception 클래스의 자식 클래스
1) RuntimeException클래스들: 주로 프로그래머의 실수로 발생하는 예외
RuntimeException 클래스를 상속받는 자식 클래스들은 주로 치명적인 예외 상황을 발생시키지 않는 예외들로 구성됨
따라서 try / catch 문을 사용하기보다는 프로그램을 작성하면서 예외가 발생하지 않도록 주의를 기울이는 편이 좋음.
이처럼 예외처리를 개발자의 판단에 맞기는 경우 (ex. 데이터 오류 등), Unchecked Exception 라고 함
ex) - ArrayIndexOutOfBoundException: 배열에서 존재하지 않는 인덱스 가리킬때 - ArithmeticException: 정수를 0으로 나누려고 하는 경우 - ClassCastException: 클래스간의 형변환을 잘못한 경우 - NumberFormatException: 숫자데이터 문제데이터 등을 넣었을 때 - NullPointerException: null 객체의 레퍼런스를 이용하거나 null 객체의 인스턴스 메소드를 호출하는 등 |
2) Execption클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
(RuntimeException클래스들을 제외한 나머지 클래스들)
RuntimeException클래스들 이외의 Exception 클래스에 속하는 자식 클래스들은 치명적인 예외 상황을 발생시키므로, 반드시 try / catch 문을 사용하여 예외를 처리해야만 함. 이처럼 예외처리를 반드시 해야하는 경우는 (ex. 네트워크, 파일 시스템, 파일 입출력 등) Checked Exception라고 함
ex) -ClassNotFoundException: 실수로 클래스의 이름을 잘못 적은 경우 -DataFormatException: 입력한 데이터 형식이 잘못된 경우 -FileNotFoundException: 존재하지 않는 파일의 이름 입력 시 |
예외처리 방법
1. try-catch-fianally문 : 예외 발생 시 개발자가 알아서 해결
-catch문과 finally문은 선택(옵션)이므로 반드시 작성할 필요는 없음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | try { 예외를 처리하길 원하는 실행 코드; } catch (e1) { e1 예외가 발생할 경우에 실행될 코드; } catch (e2) { e2 예외가 발생할 경우에 실행될 코드; } ... finally { 예외 발생 여부와 상관없이 무조건 실행될 코드; } | cs |
●어떤 예외가 발생했는지 알기 위해 사용하는 메소드들
(Throwable클래스를 상속받고 있으므로 바로 호출가능)
e.printStackTrace(); : 어떤 예외 발생했는지 콘솔에 출력 ex) java.lang.ArithmeticException: / by zero e.getMessage(); : 예외 간략히 나타낸 문자열 나타냄 ex) / by zero |
1 2 3 4 5 6 7 8 9 10 11 12 | try { System.out.println(5 / 0); } catch (Exception e) { e.printStackTrace(); String msg = e.getMessage(); //java.lang.ArithmeticException: / by zero System.out.println("Exception: " + msg); //Exception: / by zero } | cs |
결과:
2. throws 키워드 사용하여 메소드에 예외 선언하기
:예외처리 직접 하지 않고 호출한 곳으로 넘김 (단순히 예외를 전달만 하므로 결국 try-catch문으로 예외처리 필요)
사용자 정의 예외 클래스
자바에서는 Exception 클래스를 상속받아 자신만의 새로운 예외 클래스를 정의하여 사용 가능
사용자 정의 예외 클래스에는 생성자뿐만 아니라 필드 및 메소드도 원하는 만큼 추가 가능
(요즘에는 Exception 클래스가 아닌 예외 처리를 강제하지 않는 RuntimeException 클래스를 상속받아 작성하는 경우 많음)
1 2 3 4 5 6 7 | class MyException extends RuntimeException { MyException(String errMsg) { super(errMsg); } } | cs |
try-with-resources 문 (자동 자원 반환)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static String readFile(String filePath) throws IOException { BufferedReader br = new BufferedReader(new FileReader(filePath)); try { return br.readLine(); } finally { if (br != null) br.close(); } } | cs |
위와 같이 Java SE 7 이전에서는 finally 블록을 사용하여 사용한 파일을 닫아줘야 했음
하지만 try-with-resources 문을 사용하면 다음과 같이 자동으로 파일의 닫기를 수행할 수 있음
1 2 3 4 5 6 7 | static String readFile(String filePath) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { return br.readLine(); } } | cs |
'Java' 카테고리의 다른 글
[자바 Ch2] 기본형변수의 형변환(Casting) (0) | 2019.04.24 |
---|---|
[자바] 기본형과 String(문자열)간의 변환방법 (0) | 2019.01.29 |
[자바] 제어자(Modifier)- 접근제어자와 기타제어자 (0) | 2019.01.22 |
[자바] 객체지향 프로그래밍Ⅱ- 다형성(Polymorphism) (1) | 2019.01.22 |
[자바] 객체지향 프로그래밍Ⅱ - 인터페이스(Interface) (0) | 2019.01.19 |