#TIL, Java Study 예외처리 ( Exception )

< 이것저것 >
* String Tokernize : 기준점 중심으로 스트링을 자르는 것. ( == String.split(); )
* nullPointException : 객체가 안만들어졌는데....?
* BufferedLIne은, 더이상 데이터가 없을때 null이 된다. 그래서 ((line!=br.readLine())!=null)의 조건이 성립
* close에서는 ioexception이 발생할 수 있음. > io익셉션해주어야 함.
* close 해주지 않으면, io객체가 연결을 쭉 이어나가서, 계속 메모리를 잡아먹음. 
(청소부 : 가비지컬렉터 : 연결중이면 회수를 못함. >> 메모리 부족. close 선언해줘야 가비지콜렉터에서 회수함.) 

25. 예외 처리 ( Exception )

(1) 예외

: 프로그램이 정상적으로 진행되지 못하게 하는 '돌발 상황'

( ex) JVM입장의 돌발 상황 ? )

  • 숫자가 아닌 형태의 문자를 숫자로 바꾸려 할 때.
  • 채팅하다가 상대가 나가버리는 경우
  • 게임하다가 게임 서버가 다운 된 경우, 전원케이블 빠진 경우, 번개쳐서 정전이 된 경우
    ==> 이럴때 예외를 처리해주어야 함. ( 어떻게 할지를 알려줌 )

(2) 예외처리 목적

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

(3) 계층도

  • Object -> Throwable -> Exception -> 1) Compile Exception / 2) Runtime Exception
                   // 런타입익셉션이 아니면, 무조건 컴파일 익셉션이다. 
                   // 컴파일은 되지만, 실행이 되지 않으면, 런타입 익셉션이다. 

(4) 특징

1) throw 로 예외를 발생시킴.
2) throws 로 예외발생 가능성을 표식할 수 있음. ( == 예외처리를 JVM에게 떠넘길 수 있음 )
3) try ~ catch 로 잡을 수 있음. ( == (적극적) 예외를 때려잡는 것 )
4) 생성자나 메소드 에서만 발생할 수 있음 ( 멤버변수는 상태기때문에 예외X )
5) 상위 Exception 으로도 처리가 가능 .

* 상위로 잡을 수 있는데도, 하위 익셉션으로 예외를 잡는 이유??
    1) 따로따로 처리하므로 분기가 쉬움
    2) 더 기능이 많음
->하위가 상위보다 가능한 처리가 많음  
> 상황에 최적화 된 예외처리가 가능해짐 
> catch절 다양하게 처리 가능.

(5) 처리방법 ( * )

** 어떤 걸 써야할까?

1) 내가 사용하는 기능의 API에 있는 throws 예외를 잡아주자!
2) 해당 예외가 compile인지(반드시 잡아야함), runtime인지 확인하고, 자식부터 순서대로 잡기!

1) 때려 잡는 법 - 생성자 / 메소드 안에 try ~ catch

try { 예외발생구문(생성자나 메소드) } catch ( 예외타입 객체 ) { 예외 처리 로직 }

2) 떠넘기는 법 - 생성자 / 메소드 옆 throws 예외타입

throws 예외타입 (JVM이 처리)
( BUT 떠넘기면, close를 못하고, 그러면 가비징을 할 수 없게 됨. )
시기는 상관 X, 메인메소드나 생성자에서 메소드 호출해서 잡아줄수도 있음. (JVM에게 넘기지 않으려면)

(6) try 절 안에 2개 이상의 예외가 발생

1) 예외들이 상속관계 : 순서 존재. 하위예외부터 잡아 주어야 함. (자식)

catch(MyException me)
catch(Exception e)

2) 상속관계가 아닌 경우 : 순서가 존재하지 않음.

catch(MyException me)
catch(YourException ye)
ex)day13/B.java

(7) 2개 이상의 예외를 떠넘길 때

(ex : throws MyException, YourException, ... )

: 생성자 옆에 throws는 여러개 + 나열순서는 상관 없음.
ex) day13/C.java

(8) finally

1) 항상 수행되는 절 ( return을 만나도 finally는 무조건 실행 )
2) 'try' 절이 나오면, 'catch' 절이 나오거나, 'finally' 절이 나오거나 '둘 다' 나와야 한다.

       (  try+catch   ||   try+finally   ||   try+catch+finally  ) 

3) System. exit(-1) : 무조건 종료. 시스템 클래스의 exit ( int status ) 메소드.

Q. 파라미어 안에 int status 에 들어갈 수는?
-normal termination (정상종료) - 0(zero)   /  abnormal termination(비정상종료) -1(nonzero)
( -1쓰는 이유는 프로그래머들의 관례 )

좋은 웹페이지 즐겨찾기