Java - throw,throws

2020. 7. 2. 22:53Java

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
212
213
214
215
 
public class Ex4 {
 
    public static void main(String[] args) {
        
        /*
         * throws 키워드를 사용한 예외 처리의 위임(전달)
         * 예외가 발생한 곳에서 try~ catch 블록으로 예외를 직접 처리할 수 있지만
         * 자신이 직접 처리하지않고, 메서드를 호출한 곳으로 예외를 위임(떠넘김)할 때
         * throws 키워드를 사용한다.
         * 예외 처리를 위임받은 메서드는 다시 예외 처리에 대한 책임이 발생하며,
         * 자신이 직접 처리하거나 또 다른 곳으로 위임할 수있음.
         * 최종적으로 마지막 단계의 메서드에서는 try~catch블록을 통해 처리해야함
         * ex) 자바에서는 main() 메서드
         * throws 키워드를 사용하여 지정하는 예외 클래스는 1개 또는 복수개 일 수 있음
         * 
         * 
         * 기본문법
         * [접근제한자] 리턴타입 메서드명([파라미터...]) throws 예외처리클래스명{
         * 
         *         예외가 발생하는 코드
         * 
         * }
         */
        
        
        //부장으로 부터 위임을 받았을 때, 현재 main() 메서드(사장)이므로
        //더이상 위임할 수 있는 곳이 없다!(문법적으로는 throws 사용하여 해결가능)
        //따라서, 최종적으로 main() 메서드(사장)에서 모든 예외를 직접 처리해야함.
        try {
            부장();
        } catch (Exception e) {
            System.out.println("사장이 모든 예외를 처리");
        }
        
        
        
        
    }
    
    public static void 부장() throws Exception {//->모든 예외를 위임.!@#
        //1.위임받은 2개의 예외를 모두 직접 처리하는 경우
//        try {
//            과장();
//        } catch (ArithmeticException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
        
        //2.부장이 위임받은 예외를 직접 처리하지 않고, 사장에게 위임하는 경우
        //ArithmeticException, ClassNotFoundException 예외를 직접 명시해도 되지만
        //상위클래스 타입을 위임도 가능
        과장();
    }
    
    
    public static void 과장() throws ArithmeticException,ClassNotFoundException{
        //대리1,대리2로 부터 2개의 예외를 위임받아서 처리할 떄
        //1. 위임받은 과장이 직접 예외를 처리하는 경우
//        try {
//            대리1();
//            대리2();
//        } catch (ArithmeticException e) {
//            System.out.println("과장이 대리1의 예외를 직접 처리");
//        } catch (ClassNotFoundException e) {
//            System.out.println("과장이 대리2의 예외를 직접 처리");
//        }
        
        //2.위임받은 과장도 예외를 부장으로 위임하는 경우
        //발생할 가능성이 있는 예외 클래스를 모두 throws 키워드 뒤에 명시
        대리1();//ArithmeticException
        대리2();//ClassNotFoundException
    }
    public static void 대리1()throws ArithmeticException{
//        //예외처리 방법1. 예외가 발생한 곳에서 try~catch 블록 사용하여 직접 처리
//        try {
//            System.out.println("대리1에서 예외발생");
//            System.out.println(3/0);//예외 발생하는 코드
//        } catch (Exception e) {
//            System.out.println("대리1가 직접 예외를 처리함");
//        }
//    }
        //예외 처리 방법2. 예외를 직접 처리하지않고 throws 키워드를 예외 위임
        //현재 대리1() 메서드를 호출한 곳(과장()))으로 예외를 던짐 (throws)
        //대리1()메서드 선언부 마지막에 throws키워드를 쓰고, 키워드 뒤에
        //예외클래스를 명시(1개 또는 복수개 지정가능)
        System.out.println("대리1에서 예외발생");
        System.out.println(3/0);//예외 발생하는 코드
    
    
    }
    public static void 대리2() throws ClassNotFoundException {
        System.out.println("대리2에서 예외발생");
        Class.forName("com.mysql.jdbc.Driver");
    }
    
    
    
}
 
 
 
public class Ex5 {
 
    public static void main(String[] args) {
        
        /*
         * 사용자 예외 발생(throw)
         * 자바 기준으로 예외가 아닌 상황에서도 개발자의 의도대로 예외를 발생시키는 것 
         * throw 키워드를 사용하여 발생시킬 예외 클래스의 객체를 지정(강제로 예외 발생)
         * 일반적으로 예외 객체는 한번 발생시키면 재사용할 일이 없으므로 별도의 변수없이
         * 임시객체 형태로 사용하는 경우가 많음
         * (throw 변수명 또는 throw new 예외클래스명()형태를 사용)
         * 
         * 기본문법
         * throw 예외객체;
         */
        
        try {
            exceptionMethod(105);
        } catch (Exception e) {
//            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        
        try {
            userExceptionMethod(105);
        } catch (InvalidScoreException e) {
            e.printStackTrace();
        }
        
    
        
        
    }
    
    
    
    
    
    public static void exceptionMethod(int score) throws Exception {
        //점수를 입력받아 학점 계산하는 메서드
        //단 , 점수는 0~100사이로 한정
        //만약 0~100사이가 아닐 경우에는 비정상적인 점수이므로 오류 발생해야함
        //그러나, int형 변수 범위에 포함되므로 자바 기준으로 오류(예외)가 아니다.
        //따라서, 사용자가 원하는 시점에 원하는 조건이 발생했을 때 강제로 예외를 발생시킬수있음
        if(score<0||score>100) {
            //점수 범위를 벗어날 경우 메서드를 호출한 곳으로 예외를 던짐
            //단, 자바 기준으로 예외가 아니므로 throws 사용 불가
            //throw 키워드를 사용하여 원하는 예외를 직접 발생시킬수 있다.
            
            //Exception 클래스 인스턴스를 생성하여 생성자에 예외 발생 메세지 전달
            Exception e=new Exception("점수입력오류");
            //throw 키워드 뒤에 객체 지정하여 해당 예외 객체 던짐.
            throw e;
            
            //위의 방법은 Exception 객체의 변수 e를 한번 쓰고 더이상 쓸일이 없으므로
            //별도의 변수없이 바로 객체 생성하여 사용도 가능=임시객체
//            throw new Exception("점수입력 오류");
            //throw 키워드로 강제 예외 발생 시 예외 처리를 위임 필수
            //메서드 뒤에 throws Exception 사용해야함.
        }else {
            //학점계산
        }
        
    }
    
    public static void userExceptionMethod(int score) throws InvalidScoreException {
        if(score<0||score>100) {
            //Exception 클래스 대신 사용자 정의 예외 클래스 사용할 수 있음
            throw new InvalidScoreException("점수입력오류");
        }else {
            //학점계산
        }
        
    }
 
}
 
 
/*
 * 사용자 정의 예외 클래스 작성
 * 기존에 자바로부터 제공받은 예외 클래스들은 사용자가 원하는 예외의 이름이 아닐 수 있음
 * 따라서, 사용자가 별도로 예외클래스를 작성 할수 있음
 * Exception 클래스를 상속받는 서브클래스를 정의
 */
class InvalidScoreException extends Exception{
    //생성자를 정의하여 예외 메세지를 슈퍼클래스의 생성자에 전달
    public InvalidScoreException(String message) {
        super(message);
    }
}
 
 
 
cs

Exception으로 예외 발생을 다 넘겨줄 수 있지만 개발자 입장에서는 예외의 발생명이 직관적이지 않을 수 있기 때문에

throw를 사용하여 직접 예외변수명을 설정하여 넘겨줄 수 있다. Exception을 상속받는 사용할 변수 명의 클래스를 생성해 주고 생성자를 만든 다음 파라미터에 메시지를 넘겨받고 super()로 Exception의 생성자에 메시지를 넘겨주는 오버 라이딩을 하면 준비는 끝난다. 그리고 예외 발생할 수 있는 곳에 throw 문법 뒤에 new본인이 설정한 예외 변수 클래스를 선언해주고 그 클래스에 Throws 본인이 설정한 예외 변수 클래스를 선언해주면 끝이 난다. 조금 복잡해 보이지만 익숙해져서 좀 더 편하고 협력적으로 일을 할 수 있도록 해보자.

'Java' 카테고리의 다른 글

Java - Thread,synchronized  (0) 2020.07.02
Java - Thread  (0) 2020.07.02
Java - 예외(Exception),try~catch  (0) 2020.07.02
Java - 정규표현식,Pattern,Matcher  (0) 2020.07.02
Java - SimpleDateFormat,MessageFormat  (0) 2020.07.02