Java/Java

Java 07. 예외 처리

shin96bc 2022. 3. 9. 18:47

(1) 예외( Exception )
     1) 프로그램이 정상적으로 진행되지 못하게 하는 '돌발 상황' 
          ex) 숫자가 아닌 문자열을 숫자로 바꾸려할 때
              채팅하다가 상대방이 나가 버릴때
              온라인 게임하고 있는 중에 전원케이블이 빠짐
              게임 서버 다운됨
              등등...

 

(2) 처리 목적
     1) 프로그램 진행시 발생할 수 있는 '돌발 상황'을 예외로 미리 정해놓고,
        해당하는 예외가 발생했을 경우 적절한 조치를 취해서, 프로그램이
        '정상 작동'히도록 하는 것

 

(3) 계층도
                         Object
                             |
                       Throwable
                        |           |
                    Error     Exception
                        |        |
      compileException    RuntimeException
    (CheckedException) 

    ex) IOException -> CompileException
        NumberFormatException -> RuntimeException

 

(4) 특징
     1) 일(생성자 or 메소드)할때 발생할 수 있음
     2) throw 로 예외 객체를 던짐(발생시킴)
     3) throws 로 예외 발생 가능 '표식'을 함( == (소극적으로) 떠넘김 )
     4) try catch 로 잡을 수 있음 ( == (적극적으로) 때려 잡음 )
 

(5) 방법
     1) 때려 잡는 법 ( 적극적인 처리 )

          <1> try catch
               ex) try{
                        예외가 발생할 수 있는 구문( 생성자 or 메소드 )
                    }catch(예외타입 예외객체){
                        처리로직
                    }
 
     2) 떠넘기는 법 ( 소극적인 처리 )
          <1> throws 예외타입

               ex) void m3() throws Exception {}

          <2> 메소드나 생성자의 이름 옆에 throws 를 적고 바디 안에서 발생할 수 있는 Exception 을

                적어주면 Exception 이 발생했을 때 자신을 호출한 곳으로 Exception  을 보낸다.

          <3> 만약 아무곳에서도 Exception 을 잡지 않았을 경우에는 JVM 한테까지 가게된다.

 

(6) 순서 ( try절 안에 2개 이상의 예외가 발생시 )
     1) 상속관계가 아닐때는 순서 상관없이 아무예외나 먼저 잡아주면 된다.
          ex) catch(MyException me)
              catch(YourException ye)
      
     2) 상속관계일 경우에는 하위예외부터 잡아 줘야한다. ( 자식 예외 먼저 )
          ex) catch(IOException me)
              catch(Exception e)

     3) 자식예외를 먼저 잡는 이유는  구체적이고 세련된 예외처리를 위해서 이다.

 

(7) 2개 이상의 예외를 떠넘길 때
     ex) throws MyException, YourException, ... ,Exception
  

(8) finally 절
     1) try절이 나오면
        catch절이 나오던지 finally절이 나오던지
        둘다 나오던지 해야한다.

     2) finally 절은 반드시 수행되는 절이다.
          <1> 예외 발생과 상관 없이 수행된다.
          <2> 심지어 return 을 만나더라도 finally 절을 수행 후 리턴된다.

     3) finally 절이 유일하게 실행되지 않을 때가 있다. ( 즉시 종료 명령어를 만났을 때 )
          <1> System.exit(0);   // normal termination
          <2> System.exit(-1);  // abnormal termination