Kim-Baek 개발자 이야기

자바 기본 ( 18 ) - 예외처리 본문

개발/java basic

자바 기본 ( 18 ) - 예외처리

김백개발자 2020. 11. 3. 01:19

        - Type 통일 : 부모타입에 자식객체를 모두 대입가능
상속 -> 다형성 + overriding -> abstract -> Interface
        - 코드 재사용                     -> 타입통일 : 다형성을 위해 사용이 된다.

※ 객체와의 좋은 관계
1. high cohesion (높은 집중도) (하나의 클래스가 하나의 일만 하자) : 단일 책임
2. loose coupling (느슨한 연결) - 관계가 깊을수록 다른 쪽에 영향을 끼칠 가능성이 많다.

◎ 내부 class (Nested class, inner class)
- JDK 1.1 에서 추가되었다. GUI에 대한 것이 많이 바뀌게 되었는데, 그것을 지원하기 위해 나오게 되었다.

class A{
  class B{
  }            -> class 안에 class를 정의 -> 외부 class 멤버에 자유롭게 접근하기 위해서 사용
}                                                                                       -> private 도

classA{
   private int var;
}
classB{
  void go()
  {
    System.out.print(var);   <- 접근이 안되는데 GUI 에서 이렇게 해야 편한 상황이 있어 class A안에 class B를 넣게 되었다.
  }                                              ->private 도 사용이 되니까!
}

- > Outer class (외부 class), Inner class (내부 class)
class Outer{
    class Inner{        -> outer 의 멤버
    }
}

※ inner class 의 종류
class Outer{
  class Inner{  } -> Instance Inner class -> Outer 객체의 것 : Outer 모든 멤버에 접근
  static class Inner{  } -> static Inner class -> Outer class 의 것 : Outer static 멤버만 접근
  void go(){
   class Inner{  }  -> Local Inner class -> 메소드의 것 (거의사용X)
  } 
}

◎ 예외 처리
----> 실행중 오류가 100% 발생시 코드를 잘못짠 것이다.
       - 컴파일 에러 ex) String s = 20; (100% 오류)
----> 정상으로 될 때 50%, 오류가 50% 이면 사용자의 사용이 잘못되었을 수 있다. 오류를 처리하자.
       ex) String s = null;   컴파일 ok
             s.equals("abc");  컴파일 ok   -> 컴파일러는 한줄씩만 확인한다. 이어서 생각하지 않는다.
             ->  NullPointerException (100%오류)
----> String url ="www.google.co.kr";
        url 로 연결해라! 라는 코드를 작성 (프로그램은 완벽)
        -> 만약 네트워크가 연결이 안된다면? 어떤 상황이냐에 따라 될수도 안될수도!

※ 오류 : 프로그램이 정상적으로 실행되지 않는 상황 -> 오류를 객체화 : class
                                                  -> 실행 시점의 오류 : 컴파일 에러

 오류의 종류
1. Error : program 내에서 처리가 안되는 오류 (발생하면 끝)
2. Exception : 처리가 가능한 오류
                       -> 정상화 : Exception handling - 발생한 Exception을 처리해서 정상흐름으로 돌리는 것

※ Call Stack 메카니즘 : JVM -> JVM (흐름)  ,  main '  {  '-> main  '  }  ' (코드)
method : caller------> worker
                         <------return
 


오류가 나도 JVM에서 시작해 JVM으로 끝나게 된다 (호출한 곳으로 계속간다(오류가 나서 리턴 : throw))
-> 오류가 나면 나머지 아래(파란색) 부분은 모두 실행을 하지 못한다
오류가 나는 부분에서 처리를 하게 되면 나머지 부분은 실행이 가능하다
-> 보통 오류가 난 지점에서는 처리X (그럴수 있으면 아예 코드를 고치지!)
  : 호출한 부분에서 처리하게 된다.

※ Exception 구문
- unchecked (계열) Exception : 예외처리여부를 compiler가 체크안하는 exception 들
         - 처리를 안해서 오류가 나던 말던 관심없다
         - system 레벨 예외 : system(core)상에서 발생하는 오류
             -> JVM에게 맡긴다
             -> 수정해야 되는 경우가 많다(코드가 틀림), 일반적으로 처리보다는 수정.
         - RuntimeException 이 최상위 class
ex) void go (String s){
         s.-----();
       }
         go(null)   ---> 에러발생 : 만들때는 모른다! (null 이 올 수도 안 올 수도 있다) 

int[ ] a = {1, 2}   a[5]=20;
-> Java 에서 지켜야할 것이다. System 문법적인 오류 -> system 쪽에서 발생하는 것이니 system(JVM)에게 맡기자
-> 내가 하는 업무와는 관계없이 프로그램이 지켜야하는 것을 안지켰어.

- checked (계열) Exception : 예외처리코드가 없으면 compile에러 발생하는 exception
  -> 예외처리를 반드시 해야하는 exception
  -> application 레벨 exception -> 업무의 흐름상 발생가능한 exception
     -> 실행환경과 관련이 있는 에러, 사용자의 사용법
  -> code 작성시 발생가능성이 있다는 것은 알지만 발생여부는 알 수 없다. -> 처리코드 필요
  -> RuntimeException 제외한 모든 Exception -> Exception 을 상속 (최상위)

ex) url 받기, url 연결, 정보받기
if(네트워크 연결 x){

}   -> 내 업무로직에서 발생하는 오류이다. 실행환경 흐름상 충분히 발생가능 (application)
     개발자는 발생할지 알 수 없다. -> 작성자가 만든것이니 작성자가 처리해! 컴파일러가 강제한다.

- 상속의 계층구조


※ try, catch , finall(실제처리 : if, else 처럼 같이 써야한다.)throws(처리할 곳으로 미룬다) : 처리관련 키워드
    throw -> 예외발생



throw new exception(); : 더 이상 실행하지 않겠다.

※ try-catch-finally : 발생한 예외를 직접처리
기본구문



try{
   1. ---------- A exception 발생가능성
   2. ---------- B exception 발생가능성
   3. ---------- C exception 발생가능성
}catch(A exception ae){
   4. 처리
}catch(B exception be){
 
  5.처리
}catch(C exception ce){
  6.처리
}
  7.

1 -> 2 -> 3-> 7 : 정상구조
1 -> 4-> 7 : A exception 발생시
1 -> 2 -> 5 -> 7 : B exception 발생시
1 -> 2 -> 3 -> 6 -> 7 : C exception 발생시


※ 만약 잡을수있는 catch가 없으면 호출한 곳으로 비정상적(throw)으로 넘어간다.

※ 한번에 묶는 경우 : 한 묶음의 단위로 진행될 때(하나가 진행되지 않으면 필요없다)
                                -> 독립적으로 처리되도 될때는 따로 잡아도 된다.

※ 다중 catch 시 (상속관계에서) 하위 Exeption 부터 잡아야 한다. 아니면 뒤의 코드는 쓸일이 없어진다.
try{
  1. ---------- A exception 발생가능성
  2. ---------- B exception 발생가능성
  3. ---------- C exception 발생가능성
}catch(Exception e){            
-> 할일이 똑같다면(처리코드의 동일) 이렇게 해도 무방 (상위타입으로 잡자)

}

※ finally

try{
  1  ----------  exception 시 실행 X
}catch(A exception ae){
  2  ----------  exception 없으면 실행 X
}
  3 ----------  exception 을 못잡으면 실행X
     
-> 어느 하나도 100% 실행이 보장되지 않는다.

finally {구문}
- 예외 발생 - 처리 상황과 상관없이 
무조건 실행되는 code block
- try 블록 다음에 와야한다
- try - finally
- try -catch - finally

-> 주로 close() 코드가 들어간다.

 

반응형
Comments