본문 바로가기

자바의 정석 정리

자바의 정석 - 8.1 프로그램 에러

8.1.1 프로그램 에러 종류

  1. 컴파일 에러 : 컴파일 시에 발생하는 에러
  2. 런타임 에러 : 실행 시에 발생하는 에러
  3. 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것

8.1.2 에러와 예외

  1. 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  2. 예외(exception) : 프로그램 코드에서 수습될 수 있는 다소 미약한 오류

8.1.3 예외 클래스의 계층구조

 

예외의 두 그룹

  • Exception클래스와 그 자손(RuntimeException제외)
  • RuntimeException클래스와 그 자손

8.1.4 예외처리(try-catch)

  • 목적 : 프로그램의 비정상적 종료를 막고, 정상적인 실행상태를 유지하는 것
  • 정의 : 프로그램 실행시 발생할 수 있는 예외에 대한 코드를 작성하는 것
  • 구조
try{
    //예외가 발생할 거 같은 부분 작성
}catch(Exception e){
    //catch의 작성된 예외 발생시 작성
}

/*
catch가 여러개 있을경우 예외의 종류와 일치하는 단 한 개의 catch블럭만 수행됨.
{}괄호 생략 불가
*/

8.1.5 중복된 try-catch

try{
    try{
    }catch(Exception e){
    }
}catch(Exception e){
    try{
    }catch(Exception e){ //Error! 중복된 try-catch문에서 같은 변수를 사용할 수 없다.
    }
}

8.1.6 try-catch문의 흐름

  • try 블럭 내부에서 예외가 발생한 경우
    1. 예외에 일치하는 catch 블럭이 있는지 확인한다
    2. 일치하는 catch 블럭을 찾게되면 해당 블럭 내 문장을 수행한다. 찾지 못하는 경우 예외가 처리되지 못한다.
  • try 블럭 내부에서 예외가 발생하지 않는 경우
    1. catch 블럭을 거치지 않고 전체 try-catch 문을 빠져 나가서 수행을 계속한다.
Sysyem.out.println("출력:");

try{
    Sysyem.out.println(1);
    Sysyem.out.println(0/0); //정수를 0으로 나눌 수 없음
    Sysyem.out.println(2);
}catch(ArithmeticException ae){
        Sysyem.out.println(3);
}

Sysyem.out.println(4);

/*
출력:
1
3
4
*/

8.1.7 예외 발생과 catch 블럭

  • 예외 발생시 예외에 해당하는 클래스의 인스턴스 생성
  • 예외 발생시 생성된 인스턴스와 catch의 참조 변수를 instanceof 연산자를 통해 검사
try{
    Sysyem.out.println(0/0); //ArithmeticException예외 인스턴스 생성
}catch(ArithmeticException ae){ //instanceof연산자로 예외 인스턴스와 참조변수 확인
        if(ae instanceof ArithmeticException)
            System.out.println("true");
}catch(Exception e){ //위에서 예외처리가 되므로 실행 안됨
    Sytem.out.println("false");
}
/*
true
*/

8.1.8 printStackTrace()와 getMessage()

  • printStackTrace() : 예외 발생시 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
  • getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻음

8.1.9 멀티 catch 블럭

  • 여러 catch블럭을 '|'기호를 이용하여 하나의 catch블럭으로 만듦
try{
}catch(ExceptionA | ExceptionB e){
    e.printStackTrace();
}
try{
}catch(ExceptionA | ExceptionB e){
    if(e instanceof ExceptionA){
        ExceptionA e1 = (ExceptionA)e;
        return e;
    }
}