조회수 확인

예외처리는 여러 절로 구성되어 있습니다.



예외와 예외 클래스 & 실행 예외

예외 처리 코드 

자동 리소스 닫기 & 예외 넘기기(Throw)

사용자 정의 예외




예외 처리 코드

 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 합니다. 자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 오류를 발생시켜 개발자로 하여금 강제적으로 예외 처리 코드를 작성하도록 요구합니다.


 그러나 실행 예외는 컴파일러가 체크해주지 않기 때문에 예외 처리 코드를 개발자의 경험을 바탕으로 작성해야 합니다. 예외 처리 코드는 try-catch-finally 블록을 이용합니다.


 try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외처리를 할 수 있도록 해줍니다.


 





 try 블록은 예외 발생 가능한 코드가 위치하고, 예외가 발생하지 않는 다면 catch 블록을 실행하지 않고 finally 블록의 코드를 실행합니다.


 예외가 try 블록에서 발생한다면 catch 블록으로 이동하여 catch 블록의 코드를 실행합니다. finally 블록은 옵션으로 생략가능 합니다.


 Class.forName() 메서드는 파라미터로 주어진 클래스가 존재하면 Class 객체를 리턴하지만, 존재하지 않으면 ClassNotFoundException 예외를 발생시킵니다. 


 * TryCatchExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package except;
 
 
public class TryCatchExam {
 
    public static void main(String[] args) {
        try {
            Class clasis = Class.forName("what.class.What");
        } catch (ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
 
}
 
 
 
cs







 위 예제를 실행시키면 4라인에서 ClassNotFoundException이 발생하는데, 이것은 what.class.What 클래스가 존재하지 않기 때문입니다.



 * TryCatchFinallyExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package except;
 
public class TryCatchFinallyExam {
 
    public static void main(String[] args) {
        String data1 = null;
        String data2 = null;
        
        try {
            data1 = args[0];
            data2 = args[1];
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개값의 수가 부족합니다.");
            return;
        }
        
        try {
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(data1 + " + " + data2 + " = " + result);
            
        } catch (NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }
    }
 
}
 
 
 
cs






 위 예외가 발생하는 이유는 실행 파라미터를 주지 않았기 때문입니다. 이클립스의 [Run - Run Configurations] 를 클릭해서 아래와 같이 파라미터를 건네주고 실행해봅시다.










예외 종류에 따른 처리 코드

 다중 catch 

  try 블록 내부는 다양한 종류의 예외가 발생할 수 있습니다. 이 경우에는 다중 catch 블록을 작성하는 것입니다. 


  catch 블록이 여러 개라 할지라도 예외가 발생하면 단 하나의 예외 catch 블록만을 처리합니다. 그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문입니다.



 * CatchByExceptionExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package except;
 
 
public class CatchByExceptionExam {
 
    public static void main(String[] args) {
        try {
            String data1 = args[0];
            String data2 = args[1];
 
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(data1 + " + " + data2 + " = " + result);
 
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개값의 수가 부족합니다.");
            return;
        } catch (NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }
 
    }
 
}
 
 
 
cs









 멀티 catch

  자바 7부터 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 multi catch 기능을 추가했습니다. 


  catch 괄호 안에 동일하게 처리하고 싶은 예외를 |(파이프)로 연결하면 됩니다.



 * MultiCatchExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package except;
 
 
public class MultiCatchExam {
 
    public static void main(String[] args) {
        try {
            String data1, data2;
            data1 = args[0];
            data2 = args[2];
            
            int value1, value2;
            value1 = Integer.parseInt(data1);
            value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(result);
            
        } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
            System.out.println("실행 파라미터의 수가 부족하거나 숫자로 변환할 수 없습니다.");
        } catch (Exception e) {
            System.out.println("알수 없는 예외 발생");
        } finally {
            System.out.println("다시 실행하세요");
        }
    }
 
}
 
 
 
cs








end




 * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다