Unicorns

All the things

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java Study] - 자바의 예외 처리(Exception Handling)
    Java 2021. 10. 1. 13:06

    예외 처리(Exception Handling)

    : 프로그램 실행 시 예외가 발생 할 수 있는데 그것을 대비한 코드를 작성하는 것이 예외 처리이다.

    예외 처리를 통해 프로그램의 비정상 종료를 막고 정상적인 실행 상태를 유지할 수 있다.

     

     

    예외 처리하기 -  try-catch 문

     

    try{
            // 예외가 발생할 가능성이 있는 문장들을 넣는다.
     }catch(Exception e){
            // Exception이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
     }

     

     

    try 블럭 내에서 예외가 발생하지 않은 경우

     

    catch 블럭을 거치지 않고 전체 try-catch 문을 빠져나가서 수행을 계속한다.

     

     

    try 블럭 내에서 예외가 발생한 경우

     

    발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.

    일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch 문을 빠져나가서 

    그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면 ,예외는 처리되지 못한다.

     

     

    예외 처리를 하지 않았을 때   

     

    0으로 나누었을 때 ArithmeticException 발생하고

    밑의 코드들이 실행되지 않고

    프로그램이 비정상 종료된다.

     

     

    다른 타입의 예외 클래스를 지정했을 때

    숫자는 0으로 나눌 수 없는데,  0으로 나누게 되면 오류가 발생하기 때문에 적절한 예외 처리를 해줘야 하는데

    ArithmeticExcetion 클래스 대신 ArrayIndexOutOfBoundsException 클래스를 설정해주었기 때문에

    예외 처리를 하지 못하고 프로그램이 비정상 종료된다.

     

    ※ ArrayIndexOutOfBoundsException :  배열의 범위에 어긋나는 인덱스를 가리킬 때 발생하는 예외

     

     

     

     

    finally 블럭

    : 예외 처리를 하든 하지 않든 항상 실행 되는 블럭이다.

    file을 close 할 때나 connection을 close 할 때 주로 사용된다.

     

     

     

    다중 catch (Multi-catch block)

    catch 블록은 한 개 이상 선언이 가능하다. 

    단, 각  catch 블록은 서로 다른 종류의 exception으로 선언해야 한다.

     

     catch 블럭은 한 번만 실행된다.

     

     

    다중 catch 블럭이 있으면 위에서 부터 탐색을 시작한다.

    NumberFormatException 를 선언한 첫번째  catch 블럭에서 이미 예외 처리를 하였기 때문에

    2번째 catch 블럭은 건너뛰게 된다.

     

     

     

    예외 떠넘기기 - throw , throws

     

    throw

     

    메서드 내부 나 block 안에서 사용

    Checked Exception 은 사용할 수 없다.

    오로지 RuntimeException에 해당하는 클래스만 사용 가능하다.

     

    throws와 달리 예외 클래스를 다중 선언 할 수 없다.

     

     

    throws

     

    메소드 선언부 끝에 작성

    메소드에 처리하지 않은 예외를 호출한 것으로 떠 넘기는 역할

    CheckedException 과 UnCheckedException 모두 선언할 수 있지만

    UnCheckedException 만 사용하는 것이 관례이다.

    throw 와 달리 예외 클래스를 다중 선언할 수있다.

    public static int divideNum(int a, int b ) throws ArithmeticException, NumberFormatException{
            int divNum = a / b;
            return divNum;
      }

     

     

    예외 계층 구조

     

    Exception  vs  Error 

     

    Exception

    : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

     

     

    Checked Exception

    Checked Exception은 complie time에 확인하고 처리해야하는 Exception 클래스이다.

    컴파일할 때 체크하기 때문에 만약 try-catch 문이나 throws 키워드를 작성하지 않으면 컴파일 에러가 발생한다.

    RuntimeException 과 Error 을 제외한 모든 클래스가 해당되며 대표적으로 IOException 과 SQLException이 있다.

     

     

    try-catch 문이나 throw 키워드를 꼭 사용해야 한다.

     

     

    Unchecked Exception

    반면에, Unchecked Exception은 실행 시에 나타나는 오류로

    컴파일러가 예외 처리 여부를 체크하지 않기 때문에 예외 처리를 명시적으로 하지 않아도 에러가 발생하지 않는다.

    즉, 예외 처리 코드를 생략하더라도 컴파일이 되는 예외

    (아래 코드의 경우 실행 시 ArithmaticException 발생)

     

    RuntimeException 을 상속받는 클래스로 ArithmaticException, NullPointerExeption, ArrayIndexOutOfBoundsException 등 여러 클래스가 여기에 속한다.

     

     

     

    • NullPointerException : 객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생
    • ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초고하여 사용할 경우 발생
    • NumberFormatException : 숫자로 변환될 수 없는 문자가 포함되어 있을 경우 발생
    • ClassCastException : 타입 변환이 되지 않을 경우 발생

     

    Error

    : JVM에 의해 발생하기 때문에 프로그램 코드에 의해서 수습될 수 없는 심각한 오류이다,

    Error 가 발생하는 주된 이유는 애플리케이션 실행 중에 나타난 환경의 결함 때문이다.

     

    ex) : StackOverflowError , VirtualMachineError , OutOfMemoryError

     

    Custom Exception (사용자 정의  예외)

    Exception 또는 RuntimeException 을 상속받아 직접 예외 클래스를 정의할 수 있다.

     

    InValidAgeException 이라는 예외 클래스를 직접 정의하여 사용하였다.

     

     

     

     

     

     

     

     

    REFERENCE

    자바의 정석
    이것이 자바다
    https://www.javatpoint.com/exception-handling-in-java

    댓글

Designed by Tistory.