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로 바로 잡아서 처리하든 해야함. |
사 용 법 | | try{ 예외발생예상코드 }catch(예외처리클래스명 객체명){ 예외발생시 처리코드 }catch(예외처리 클래스명 객체명){ ....... ..... }finally{ 반드시 수행코드 } | cs |
| | 접근지정자 반환형 메서드명(매개변수...) throws 예외처리클래스명{ 예외발생예상코드 ; // 예외발생뒤 아랫줄 실행 } | cs |
| | try{ throw new 예외처리클래스(); }catch(예외처리클래스){ } | cs |
| 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에서 제공하는 예외처리클래스가 지금의 업무와 맞는 것이 없다면 업무에 맞는 예외처리클래스를 개발자가 직접 작성해서 사용할 수 있다.
| public class MyException extends Exception{ public MyException(){ super("출력 메세지"); } |