SyntaxHighlighter.all(); [자바] 예외처리(Exception Handling) :: 게을러지고 싶어 부지런한 개발자

예외 & 예외처리란? 


예외(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 문 (자동 자원 반환)

JDK1.7부터 try-with resources문이라는 try-catch문의 변형이 새로 추가됨 
-이 구문은 주로 입출력(I/O)과 관련된 클래스 사용 때 유용

ex) 파일에서 문자열을 한 줄 읽어오는 예제
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




+ Recent posts