Java - 예외(Exception),try~catch

2020. 7. 2. 22:45Java

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
 
public class Ex {
 
    public static void main(String[] args) {
        
        /*
         * 예외(Exception)
         * 프로그램실행 중 발생하는 의도치않은 상황(문제)
         * 예외발생 시 프로그램은 실행 도중 비정상적으로 종료됨
         * 예외 발생 시점부터 나머지 코드가 실행 되지 않음
         * 예외 처리를 통해 프로그램을 정상적으로 종료하도록 해야함
         * Exception Handling 이라고 함
         * 예외처리를 위해서는 try~catch 문 사용
         * try 블록 내에 예외가 발생할 것으로 예상되는 코드들을 작성
         * catch 블르고 내에 특정 예외 발생 시 수행할 동작(예외 처리 코드)을 기술
         * 단, 발생한 예외를 처리할 수 있는 예외 클래스 변수선언 필요함
         * 
         * -Compile Checked Exception 계열
         * ->코드 작성 시 컴파일 시점에서 예외 발생여부를 알수있음
         * ->예외를 처리하지 않으면 컴파일 에러 발생
         * ex)SQLException, IOException 등
         * 
         * -Compile Unchecked Exception 계열
         * 컴파일 시점에서는 예외 발생 여부를 알수 없고, 실행 시점에 알수있음
         * 예외를 처리하지 않더라도 컴파일 에러 발생하지 않음
         * ex)RuntimeException 계열
         * (ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException 등)
         * 
         * 기본문법
         * try{
         *         예외가 발생할것으로 예상되는 코드들.. 
         * }catch(예외처리클래스명 변수명){
         *         지정한 예외가 발생했을 때 처리하는 코드들...
         * }
         * 
         */
        
        //------------예외 발생 시 예외 처리가 되어있지 않을 경우------------
//        System.out.println("프로그램시작");
//        
//        int num=5 , num2=0;
//        //나눗셈 두번째 피연산자가 0이면 ArithmeticException 예외 발생함
//        System.out.println(num/num2);//예외 발생!
//        
//        //예외 발생 시점 코드 아래쪽의 나머지 코드들은 실행되지 못하고 비정상적으로 종료됨
//        System.out.println("프로그램 끝");//예외 발생 시 실행 불가능한 코드
        
        
        //------------예외 발생 시 예외 처리가 되어 있을 경우------------
        System.out.println("프로그램시작");
        
        try {
            int num=5 , num2=0;
            System.out.println(num/num2);//예외 발생!
            //->ArithmeticException 예외는 RuntimeException 계열 이므로 컴파일 에러 발생하지 않음
            //따라서 코드 상에서 예외 감지가 어려우므로 직접 찾아서 예외 처리 해야함
            
            //try 블록 내에서 예외 발생 시, try 블록 내의 나머지 코드는 실행되지 못함
            //catch 블록에서 해당 예외를 찾아 예외처리코드를 실행한 후
            //try~catch 블록 바깥의 코드들은 정상적으로 실행됨
            System.out.println("예외 발생함");//예외 발생시 실행되지 못하는 코드
        } catch (ArithmeticException e) {
            System.out.println("ArithmeticException 예외 발생하여 처리");
            //예외 발생시 전달되는 예외 객체(e)를 사용하여 예외 원인 파악 가능
            //1. printStackTrace()메서드 : 예외발생 원인, 위치, 메서드호출 스택까지 모두 파악됨
            e.printStackTrace();
            //2. getMassage() 메서드 : 예외 발생 원인을 문자열로 리턴
            System.out.println("예외발생 원인 메세지 : "+e.getMessage());
        }
        
        
        
        System.out.println("프로그램 끝");
        
 
    }
 
}
 
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class Ex2 {
 
    public static void main(String[] args) {
        
        /*
         * 여러개의 예외를 처리하는 방법
         * 하나의 try 블록 내에서 복수개의 예외(Exception)가 발생할 경우
         * catch블록을 해당 예외 객수만큼 생성하여 각각의 예외클래스를 명시하거나
         * 상위 예외 클래스를 하나 선언하여 한꺼번에 처리 가능
         * 단, catch 블록은 위에서부터 차례대로 실행되므로 처리 순서에 주의해야함
         * 하위클래스타입부터 상위클래스 타입 순으로 처리해야함
         * ex) 첫번째 : ArithmeticException 2번:RuntimeException,3번 : Exception
         * 만약, 역순으로 처리하면 Exception 에서 모든 예외가 처리됨, 나머지 실행 불가
         *  
         */
        
//        System.out.println("프로그램시작");
//        
//        try {
//            int num=5 , num2=1;
//            System.out.println(num/num2);//예외 발생 가능성이 있는 코드
//            System.out.println("num/num2 실행 성공");//예외 발생시 실행되지 못하는 코드
//            
//            int[] arr= {1};
//            System.out.println(arr[1]);//예외 발생 가능성이 있는 코드
//            //배열 크기가 1이므로 1번 인덱스는 존재하지 않음(0번만 존재)
//            //따라서 ArrayIndexOutOfBoundsException 예외 발생함
//            //만약 ArrayIndexOutOfBoundsException 예외처리 catch 문이 없으면
//            //또 다시 프로그램은 비정상적으로 종료됨
//            System.out.println("배열 데이터 출력 성공");
//            
//        } catch (ArithmeticException e) {
//            System.out.println("ArithmeticException 예외 발생하여 처리");
////            e.printStackTrace();
//        } catch (ArrayIndexOutOfBoundsException e) {
//            System.out.println("ArrayIndexOutOfBoundsException 예외 발생하여 처리");
////            e.printStackTrace();
//        }
//        
//        
//        
//        System.out.println("프로그램 끝");
        
        //--------------------------------------------------------
        
        System.out.println("프로그램시작");
        
        try {
            int num=5 , num2=1;
            System.out.println(num/num2);//예외 발생 가능성이 있는 코드
            System.out.println("num/num2 실행 성공");
            
            int[] arr= {1};
            System.out.println(arr[0]);//예외 발생 가능성이 있는 코드
            
            System.out.println("배열 데이터 출력 성공");
            
            //->위의 예외 두가지 모두 RuntimeException 타입 catch블록에서 처리 가능하지만
            //아래쪽에 나오는 SQLException 등은 처리가 불가능
            //별도의 catch 블록을 사용하여 처리하거나 
            //모든 예외를 하나로 묶을 수 있는 상위 클래스인 Exception 타입으로 처리 가능
            DriverManager.getConnection("11","admin","1234");
        } catch (RuntimeException e) {
            //ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException 등
            //여러가지 예외를 하나의 상위 예외클래스 타입으로 처리
            System.out.println("RuntimeException 타입으로 예외처리!");
        } catch (SQLException e) {
            //ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException 등
            //여러가지 예외를 하나의 상위 예외클래스 타입으로 처리
            System.out.println("RuntimeException 타입으로 예외처리!");
        }
        
        
        System.out.println("프로그램 끝");
        
    }
 
}
 
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class Ex3 {
 
    public static void main(String[] args) {
        System.out.println("프로그램시작");
        
        try {
            int num=5 , num2=0;
            System.out.println(num/num2);//예외 발생 가능성이 있는 코드
            //ArithmeticException 클래스가 선언된 catch 블록에서 처리
            System.out.println("num/num2 실행 성공");
            
            int[] arr= {1};
            System.out.println(arr[1]);//예외 발생 가능성이 있는 코드
            //ArrayIndexOutOfBoundsException 예외 처리 부분이 없으므로
            //상위 타입인 RuntimeException 클래스가 선언된 catch블록에서 처리
            System.out.println("배열 데이터 출력 성공");
            DriverManager.getConnection("11","admin","1234");//예외 발생 가능성이 있는 코드
            //SQLException 예외처리 부분이 없으므로
            //상위 타입인 Exception 클래스가 선언된 catch 블록에서 처리
//        } catch (RuntimeException e) {
//            //ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException 등
//            //여러가지 예외를 하나의 상위 예외클래스 타입으로 처리
//            System.out.println("RuntimeException 타입으로 예외처리!");
        } catch (ArithmeticException e) {
            //현재 catch블록 위에 상위타입(RuntimeException) 예외를 처리하고 있으므로
            //순서대로 실행 시 ArithmeticException 예외도 RuntimeException 에서 처리됨
            //따라서, 현재 catch 블록은 실행되지 않는 코드가 됨(Unreachable catch block)
            System.out.println("ArithmeticException 타입으로 예외처리!");
        }catch (RuntimeException e) {
            //ArithmeticException 보다 상위타입인 RuntimeException 은
            // 더 아래쪽의 catch 블록에서 처리해야 한다.
            System.out.println("RuntimeException 타입으로 예외처리!");
        }catch (Exception e) {
            //예외의 최상위 타입(Throwable  제외)인 Exception 클래스 타입은
            //가장 마지막에 처리해야한다.
            System.out.println("Exception 타입으로 예외처리");
        }
        
        
        System.out.println("프로그램 끝");
    }
 
}
 
 
 
 
cs

 

DAO를 할 때 짧게 만나보았던 그냥 이렇게 해야 하는구나 하고 넘어갔던 예외처리 try~catch를 만나보았다.

예외가 발생할수 있는 문장들을 try 구간 안에 넣어두고 catch를 열어 예외가 어떤 예외에 속하는지 예외명을 적어주면 되었는데 예외의 종류가 많았지만 다 합쳐 Exception으로 묶어서 넘겨주어도 된다. 하지만 그렇게 되면

어떤 예외가 발생했는지 알수가 없고 대응을 할 수 없기 때문에 웬만해서는 예외의 종류별로 선언해주는 게 좋고

예외에도 상속의 관계가 있기때문에 우선순위가 제일 위인 Exception으로  catch문을 해버릴 경우 그다음에 오는 예외들을 처리하지 않고 그냥 넘어가 버리니 조심해서 처리해야 하겠다.

'Java' 카테고리의 다른 글

Java - Thread  (0) 2020.07.02
Java - throw,throws  (0) 2020.07.02
Java - 정규표현식,Pattern,Matcher  (0) 2020.07.02
Java - SimpleDateFormat,MessageFormat  (0) 2020.07.02
Java- enum  (0) 2020.07.01