-
[JAVA 32] 자바 예외처리 ( Exception / throws ) try{}catch(){}finally{}Language/Java 2018. 2. 17. 11:50반응형
■ 예외 처리
1. 예외 ( Exception )
프로그램이 정상적으로 진행되지 못하는 ' 돌발상황 ' 을 말한다.
ex) 키보드로 입력을 받는 도중에 키보드 선이 본체와 분리 되었을 경우.
채팅중에 상대방 또는 자신이 나가는 경우.
100만 분의 1 의 확률로 번개를 맞아 서버가 정지되는 경우.
숫자가 아닌 문자를 숫자로 바꾸려 하는 경우.
2. 예외 관련 class 계층도
Object
│
Throwable
│ │
Error Exception
│ │
CheckedException RuntimeException
ef) Error 는 자바 시스템 관련 문제시 발생하는 에러를 의미하기 때문에
자바 프로그래머는 문제를 잡아 해결 할 수 없다.
Exception 만을 자바 프로그래머가 잡을 수 있는데,
CheckedException 은 컴파일시 발생 ( 체킹 )하는 예외이고,
RuntimeException 은 실행할시 발생 ( 체킹 )하는 예외로써
처리를 하지 않더라도 컴파일은 정상적으로 진행된다.
ex) CheckedException → IOException
RuntimeException → NuberFormatException
3. 예외처리의 목적
프로그램 진행시 발생할 수 있는 돌발상황을 예외로 미리 정해놓고,
해당 예외가 발생할 경우에 적절한 조치를 취해서
프로그램이 정상적으로 작동하도록 하는 것이 목적이다.
4. 예외의 특징
1) 생성자나 메소드에서 발생한다.
2) 발생시킬 때는 throw 라는 예약어를 사용한다.
3) 처리되어야 한다고 명시할 때에는 throws 라는 예약어를 사용한다.
4) 예외는 자신의 Exception 또는 그 조상 Exception 으로 잡을 수 있다.
1234567891011121314151617181920212223242526272829class MyException extends Exception { // 예외를 생성 했다.void handle(){System.out.println("MyException handle()");}}class YourException extends Exception { // 예외를 생성 했다.2void handle(){System.out.println("YourException handle()");}}class ES { // Exception Studyboolean flag = false;ES() throws Exception { // 예외 던지기 , 뒤로 미루기if(flag) throw new Exception(); // 예외 발생 시키기}void m1() throws MyException {if(flag) throw new MyException();}void m2() throws YourException {if(true) throw new YourException();// true 이기 때문에 YourException 이 발생할 것이다.}}cs 1234567891011121314151617181920212223242526class Exception_User{boolean flag;Exception_User(){m();}void m(){try{ES es = new ES();es.m1();es.m2();}catch(MyException me){System.out.println("me : " + me);}catch(YourException ye){System.out.println("ye : " + ye);}catch(Exception e){ // 더 구체적으로 하기 위해서 하위 예외를 먼저 작성한다.System.out.println("e : " + e);}}public static void main(String[] args){new Exception_User();}}cs 5. 예외처리의 방법
1)
생성자/메소드(){
try{
예외가 발생할 수 있는 구문
}catch(발생된 예외 객체){
예외가 발생할때 처리하는 로직 ( 넘어온 예외 객체를 이용한다. )
}
2)
throws / throw 를 이용하여 예외를 호출한 ' 놈 / 곳 ' 으로 떠넘기는 방법
ex) 가계부채
6. try{} (= 블록 , 바디) 에 2개 이상의 예외가 발생할 경우
1) 상속관계의 Exception 이라면 더 구체적인 예외처리를 위해서 하위 Exception 부터 잡아 준다.
2) 상속관계가 아닌 Exception 이라면 catch절의 순서는 관계가 없다.
1234567891011121314151617181920212223242526272829class MyException extends Exception {void handle(){System.out.println("MyException handle()");}}class YourException extends Exception {void handle(){System.out.println("YourException handle()");}}class ES { // Exception Studyboolean flag = false;ES() throws Exception { // 예외 던지기 , 뒤로 미루기if(flag) throw new Exception(); // 예외 발생 시키기}void m1() throws MyException {if(flag) throw new MyException();}void m2() throws YourException {if(true) throw new YourException(); // true 이기 때문에 YourException 이 발생할 것이다.}}cs 123456789101112131415161718192021222324252627282930313233343536373839404142434445class ES2{ // Exception Study 2ES2(){m1();System.out.println("");m2();}void m1(){try{ES es = new ES();System.out.println(" m1() try1 ");es.m1();System.out.println(" m1() try2 ");}catch(MyException me){System.out.println(" m1() MyException "); // ES 클래스에서 false 이기 때문에 발생하지 않을 것이다.me.handle();}catch(Exception e){System.out.println(" m1() Exception "); // ES 클래스에서 false 이기 때문에 발생하지 않을 것이다.}}void m2(){try{ES es = new ES();System.out.println(" m2() try1 ");es.m1();System.out.println(" m2() try2 ");es.m2();System.out.println(" m2() try3 ");}catch(YourException ye){System.out.println(" m2() YourException "); // << true 이기 때문에 발생할 것이다.ye.handle();}catch(MyException me){System.out.println(" m2() MyException "); // ES 클래스에서 false 이기 때문에 발생하지 않을 것이다.me.handle();}catch(Exception e){System.out.println(" m2() Exception "); // ES 클래스에서 false 이기 때문에 발생하지 않을 것이다.}}public static void main(String[] args){new ES2();}}cs 7. finally 절
1) try{} 절 / try{}catch(){} 절이 수행되고 나서 ' 반드시 ( 항상 ) 수행되는 절 ' 이다.
2) 특징
① try{} 절이 먼저 기술되어야 나올 수 있다.
② try{} 절이 나오면 반드시 catch(){} 절이 나오던지 finally{}절이 나와야 한다.
③ 심지어는 return; 만나더라도 finally{} 절에 있는 로직이 수행된다.
예외)
System.exit( 정수 ); 를 만나면 수행되지 않고 나가게 된다.
);일반적으로 비정상 종료일 경우 ( Abnormal termination )
System.exit( 0 ); 일반적으로 정상 종료일 경우 ( Normal termination )
1234567891011121314151617181920212223242526272829class MyException extends Exception {void handle(){System.out.println("MyException handle()");}}class YourException extends Exception {void handle(){System.out.println("YourException handle()");}}class ES { // Exception Studyboolean flag = false;ES() throws Exception { // 예외 던지기 , 뒤로 미루기if(flag) throw new Exception(); // 예외 발생 시키기}void m1() throws MyException {if(flag) throw new MyException();}void m2() throws YourException {if(true) throw new YourException(); // true 이기 때문에 YourException 이 발생할 것이다.}}cs 12345678910111213141516171819202122232425262728293031323334class ES3{void m1(){try{System.out.println("1");ES es = new ES();System.out.println("2");es.m1();System.out.println("3");return;}catch(Exception e){System.out.println("4");}finally{//System.exit(0);System.out.println("5");}System.out.println("6"); // return; 때문에 출력되지 않는다.}void m2(){try{System.out.println("7");}finally{System.out.println("8");}}public static void main(String[] args){ES3 es3 = new ES3();es3.m1();es3.m2();System.out.println("9");}}cs 지금 주석 처리된 System.exit(0); 의 주석을 삭제한다면 아래와 같은 내용으로 출력이 된다.
반응형'Language > Java' 카테고리의 다른 글
[JAVA 34] 내부 클래스 ( Inner Class ) (0) 2018.02.19 [JAVA 33] 자바 패키지 ( package ) (0) 2018.02.17 [JAVA 31] 자바 인터페이스 ( Interface ) (0) 2018.02.14 [JAVA 30] 자바 오버로딩 ( Overloading ) (0) 2018.02.14 [JAVA 29] 자바 오버라이딩 ( Overriding ) (0) 2018.02.14