컴퓨터 관련/JAVA 강의

java #27 Exception Handling, 예외처리

승명 2016. 12. 18. 20:43

java #27 Exception Handling, 예외처리

 
* Exception Handling

- 가벼운 error (발생해도 다음상황으로 진행할 수 있는 것)
- 프로그램 작성시 개발자가 반드시 인지하고 처리해야 하는 것.
- 예외처리 클래스의 가장 윗부모는 Exception
- Compile Exception(개발자가 코드를 정의하여 처리하는 예외)와 Runtime Exception(JVM이 자동으로 처리하는 예외) 두가지가 존재

* 예외처리 클래스의 상속관계

throwable ┳ error ┳ AWTError                                                                           런타임 예외(JVM이 자동으로 처리)
                  │          └ StackOverflowError
                  └ Exception ┳ RuntimeException ┬ ArrayIndexOutOfBoundsException ─ 배열의 인덱스를 잘못 사용     
                                     │                           ├ ArithmeticException ─ 0으로 나눌때
       Compile 예외          │                            ├ NumberFormatException ─ 숫자의 형이 다를 때
                                     │                           └ NullPointerException ─ 객체를 만들지 않고 사용
                                     ├ IOException
                                     ├ ClassNotFoundEx
                                     ├ SQLException
                                     └ InterruptedException


※ 예외처리 방법
- try~catch (예외잡기)
- throws (예외 날림)
- throw (예외 강제 발생) 등 3가지가 있다.


try~catch 예외잡기

throws 예외날림

throw 예외강제발생

- catch에서 예외 메세지 출력
- 간단한 메세지만 출력
  예외처리객체명.getMessage()
- 예외처리클래스와 메세지를 출력
  s.o.p(예외처리객체명);
- 매우자세한 메세지(출력까지 같이한다.)
- 예외처리객체명.printStackTrace();
- method 뒤에 정의하고, method 내부에서 발생하는 예외를 호출하는 곳에서 한번에 처리하도록 만들때에 사용
- throws 사용하면 메서드 내부에서 try~catch 를 처리할 필요가 없어진다.
- 메소드 안에서 일을 처리할 때 특정 상황이 발생하면 예외를 강제로 발생시켜 그 상황을 처리하도록 하는 것.
- throw로 예외가 발생되면 throws로 발생된 예외를 날리든, try~catch로 바로 잡아서 처리하든 해야함.

1
2
3
4
5
6
7
8
9
10
11
12
try{
예외발생예상코드
}catch(예외처리클래스명 객체명){
예외발생시 처리코드
}catch(예외처리 클래스명 객체명){
.......
.....
}finally{
반드시 수행코드
}
cs
1
2
3
4
5
6
접근지정자 반환형 메서드명(매개변수...) throws 예외처리클래스명{
  예외발생예상코드 ; 
// 예외발생뒤 아랫줄 실행
}
cs
1
2
3
4
try{
throw new 예외처리클래스();
}catch(예외처리클래스){
}
cs

1
2
3
public void test() throws 예외처리클래스{
throw new 예외처리클래스();
}
cs


- 예제

Try~catch

예외잡기
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
package day0304;
 
/**
* 클래스가 실행되면 JVM이 발생하는 예외를 자동으로 처리하는 RuntimeException의 사용
*
*/
public class UseRuntimeException {
 
     public static void main(String[] args) {
          try {
               int num1 = Integer.parseInt(args[0]);
               int num2 = Integer.parseInt(args[1]);
               int result = 0;
 
               result = num1 / num2;
 
               System.out.println(num1 + " / " + num2 + " = " + result);
          } catch (ArrayIndexOutOfBoundsException aioobe) {
               System.out.println("간단한 메세지 + " + aioobe.getMessage());
               System.err.println("사용법) java UseRuntimeExceptio n 값1 값2");
               System.err.println("예외처리클래스명과 메세지 : " + aioobe.toString());
               aioobe.printStackTrace();
          } catch (ArithmeticException ae) {
               System.err.println("0으로 나눌 수 없습니다.");
          } catch (NumberFormatException nfe) {
               System.err.println("숫자형식만 입력가능");
          } catch (Exception e) {
               System.err.println("개발자가 인직하지 못한 예외");
          } finally {
               System.out.println("사용해주셔서 감사합니다.");
          }
 
     }// main
 
}// class
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package day0304;
 
/**
* 개발자가 코드 작성시 반드시 처리해야하는 예외인 compile Exception 처리
*/
public class UsecompileException {
 
     public static void main(String[] args) {
          try {
               Object obj = Class.forName("day0304.UseRuntimeException1");
               System.out.println("클래스 로딩 성공 : " + obj);
          } catch (ClassNotFoundException e) {
               System.out.println("클래스의 이름이 잘못되었습니다.");
               e.printStackTrace();
          } finally {
               System.out.println("반드시 실행되어야 하는 코드");
          }
     }
}
cs
throws
예외날림
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package day0304;
 
/**
* 메서드 내부에서 예외가 발생하면 그 예외를 메서드를 
* 호출한 곳에서 처리할 수 있도록 예외를 날리는 throws의 사용법
*/
public class UseThrows implements Cloneable {
     public void testClone() throws CloneNotSupportedException {
          UseThrows ut1 = (UseThrows) this.clone();
          System.out.println("복제 성공 : " + ut1);
     }// 객체를 복제 : object.clone();를 호출하여 복제
 
     public static void main(String[] args) {
          UseThrows ut = new UseThrows();
          System.out.println("생성된 객체" + ut);
          try {
               ut.testClone();
          } catch (CloneNotSupportedException e) {
               System.err.println("복제할 수 없는 객체입니다.");
               e.printStackTrace();
          }
     }// main
}// class
cs

throw
예외강제발생

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
package day0305;
 
import java.util.Random;
 
/**
* 특정상황에서 예외를 강제로 발생시켜 처리하기
*/
public class UseThrow {
public String ducksu() throws Exception{
     String result="";
     int classGrade=new Random().nextInt(3);
     String[] gradeTitle={"초딩","중딩","고딩"};     //0-고딩 / 1-중딩 / 2-고딩
     result=gradeTitle[classGrade]+"흡연중...빠르게 지나간다.";
     if (classGrade ==0){
          //throw new Exception(); //메세지 없음
          throw new Exception(gradeTitle[classGrade] + "님 건강을 생각하세요!!!");
          //원하는 메세지를 넣어서 예외를 발생시킨다.
     }//end if
     return result;    
}
     public static void main(String[] args) {
          UseThrow ut = new UseThrow();
          try {
               String msg=ut.ducksu();
          } catch (Exception e) {
               e.printStackTrace();
          }
     }
}
cs

* 사용자 정의 예외 클래스


- Java에서 제공하는 예외처리클래스가 지금의 업무와 맞는 것이 없다면 업무에 맞는 예외처리클래스를 개발자가 직접 작성해서 사용할 수 있다.

1
2
3
4
5
public class MyException extends Exception{
public MyException(){
    super("출력 메세지");
}