Web develop/JAVA

[JAVA] 자바 예외처리(Exception) 예제

ForA 2019. 4. 26. 10:55
728x90

: 프로그램 실행 중에 발생하는 예기치 않은 사건 처리.

자바는 프로그램 실행 중 발생할 수 있는 예외를 처리할 수 있는 기법을 제공한다. 발생하는 모든 예외를 객체로 취급하고 예외관련 클래스를 제공한다.

에러발생 예제

  • 정수를 0으로 나누는 경우

  • 배열의 첨자가 음수값을 가지는 경우

  • 배열 첨자가 배열의 크기를 벗어나는 경우

  • 부적절한 형변환이 일어나는 경우

  • 입출력시 interupt가 발생하는 경우

  • 입출력하기 위해 지정한 파일이 존재하지 않거나 파일 이름이 틀린 경우

int su = 3.14; //에러 --> int자료형에서는 0.14에 대한 표현을 할 수 없다.
int su = (int)3.14; //su변수에 3이 저장

double d = 30;         //묵시적인 형변환. d변수에 30.0이 저장
double d = (double)30; //명시적인 형변환 

(int)"홍길동" //에러발생: String과 int자료형은 공통점이 없다.
(B)A          //에러발생: A클래스와 B클래스간의 상속관계가 없다.

(Object)String --> Object ob = (Object)"길동";
--> 부모캐스팅은 보통 생략 => Object ob = "길동";
ob.length() //에러발생 
ob.toString() //에러발생. toString()메소드는 String 클래스의 메소드다.

(String)Object 
--> 자식캐스팅: 반드시 명시 String str = (String)ob;
str.length() //3 실행

(Parent)Child데이터(생략가능) 
(Child)Parent데이터 
==> 상속관계에 있었을 때만 캐스팅이 가능하다.

Exception 클래스 계층구조

               java.lang.Object
                       |  
            java.lang.Throwable
                       |  
           ------------------------  
          |                        |  
        Error                  Exception
  • 예외발생시 JVM에서 관련된 예외클래스로 부터 예외 객체 생성하고 프로그램에서 지정된 예외처리루틴에게 넘겨준다.
  • Error발생하는 경우 : 하드디스크 포맷이 망가진경우, 메모리 파괴, 스택오버플로우 (메모리가 적재되다가 과부화하여 에러)

throw문

  • throws문은 예외가 발생시 할일에 대해 전가의 뜻을 가짐.
 void gildong() throws IOException
{
    readLine();
}

void lime()
{
	gildong();
}

try~catch문

    void hello(){
      try  {  //대체적으로 메소드 호출문장에서 예외 발생
              1; 
              2; ->AException 발생 가능성
              3;
              4; ->BException 발생 가능성 
          } catch(AException e) { //catch(예외타입 변수명)
              AException 발생시 실행할 문장;
            } catch(BException e){ 
                        BException 발생시 실행할 문장;
              } 
      }
    }

각각 처리

    try{
        AException문장이 발생할 가능성 있는 문장1;
    }catch(AException e){
        AException 발생 시 처리할 문장;
    }
    try{
        BException문장이 발생할 가능성 있는 문장2;
    }catch(BException e){
        BException 발생 시 처리할 문장;
    }

finally

    try{
        AException문장이 발생할 가능성 있는 문장1;
        BException문장이 발생할 가능성 있는 문장2;
        CException문장이 발생할 가능성 있는 문장3;
        } catch(AException e){
                AException 발생 시 처리할 문장;
            }catch(BException e){
                BException 발생 시 처리할 문장;
            }finally{ 
                예외발생과 상관없이 반드시 실행할 문장;    
              }
    }

※ 다중 catch를 사용할 때 주의할 점

  • 부모자식 클래스 정의하는 순서에 주의
  • 자식클래스에 대한 catch문을 먼저 정의해야 함
                                //catch에서 선언한 클래스     예외발생 클래스 
    catch(ParentException pe){} // => ParentException pe = new ParentException();
    catch(ChildException ce){} //에러발생=> ParentException pe = new ChildException();
    ---
    catch(ChildException ce){}    //ChildException ce = new ChildException();
    catch(ParentException pe){}   //ParentException pe = new ParetnException();

예외 종류

체크(Checked) 예외

    public static void main(String[] args) throws IOException {
        System.in.read(); // Unhandled Exception type IOException
    }
  • 컴파일 에러발생
  • 명시적으로 발생할 수 있는 예외에 대한 처리를 강요
  • 반드시 try~catch 또는 throws를 사용해야함
    in.readLine() // --> unhandled exception IOException 에러발생
    new FileReader("a.txt") //--> unhandled exception FileNotFoundException 에러발생

언체크(UnChecked) 예외

public static void main(String[] args) {
    String[] names = {"길동", "주원"}//배열 인덱스 0,1 생성
    System.out.println(names[3]);//컴파일시에는 에러가 발생하지 않고 런타임시 에러발생
}
  • 개발자 실수 또는 사용자 입력데이터로 인해 예외 발생
  • 컴파일시 에러가 발생하지 않는다.
  • 특징은 RuntimeException(부모)을 상속받는 예외(자식)클래스
  • try~catch 또는 throws 사용 가능
  • if문을 통해 처리가능

사용자 정의 예외

  • 예외의 발생은 JVM에 의해 실행중 발생할 수도 있지만 사용자 프로그램에서 인위적으로 예외를 발생시킬 수 있다. (throw문을 제공)

    throw 예외객체;
    throw new 예외객체타입(매개변수);
    
    class MyException extends Exception{
      public MyException(String msg){
          super(msg)
      }
    }

예외 오버라이딩 시 주의할 점

  1. 접근제한자는 부모와 동일하거나 확장해야 함
  2. throws는 부모와 동일하거나 축소해야 함