🐤 study/Java

[Java] 에러처리 | Try-catch | 컴파일 오류, 런타임 오류, 논리 오류 | 예외처리 방법 | checked, unchecked exception | 예외 우선순위

budtree 2022. 7. 23. 14:44

Try-catch

try? catch? 예외처리란 뭐 하는 건가요?

프로그래밍 오류의 종류

컴파일 오류 : 프로그램의 실행을 막는 오류, 대부분 문법적인 오류다.

//1 (키워드 맞춤법 오류)
inet num = 1;
//2 (세미콜론 누락)
boolean a = false
//3 (endif문부터 사용)
end if(!a) {
    return;
}
//4 (선언안된 변수 사용)
b = 3;

런타임 오류 : 프로그램 실행 중 발생하는 오류, 수행할 수 없는 작업 시도시 발생

1. 0으로 나누는 경우
2. 무한루프에 빠지는 경우
3. null point error

논리 오류 : 사용자가 의도한 작업을 프로그램에서 수행하지 못하는 오류, 예측 불가능한 오류

try-catch

정의 : 예외를 처리하기 위한 구문

예외처리 : 오류가 발생할 수 있는 부분을 예측한다. try블록에서 오류가 발생하면 catch로 처리하고 다른 조치를 취할 수 있다.

구조

try {
    //예외발생 가능성이 있는 코드
} catch(Exception1 e) {
    //Exception1 발생시 처리할 문장
} catch(Exception2 e2) {
    //Exception2 발생시 처리할 문장
} finally {
    //예외발생여부에 관계없이 수행되어야 하는 문장
}

finally문 → try에 return이 존재하더라도 finally 구문안에 있는 명령어는 반드시 실행한다.

흐름

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

발생하는 예외와 일치하는 catch문이 있는지 확인

→ 있으면 catch블럭 내 문장 실행, 없으면 에러 발생(에러가 처리되지 못했기 때문)

예외메세지 얻는방법

  1. printStackTrace()
    : 예외발생 당시의 call stack에 있던 메서드의 정보와 예외 메세지를 출력한다.
  2. getMessage()기본적인 내용은 알 수 있지만 상세하진 않음
    : 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있음

예외 던지기

throw e : 개발자가 고의로 발생시키는 예외

try {
    Exception e = new Exception("에러 발생");
    throw e;
} catch(Exception e) {
    System.out.println("메세지:" + e.getMessage());
    e.printStackTrace();
}

예외 던지기

throw e : 개발자가 고의로 발생시키는 예외

try {
    Exception e = new Exception("에러 발생");
    throw e;
} catch(Exception e) {
    System.out.println("메세지:" + e.getMessage());
    e.printStackTrace();
}

예외의 우선순위

예외는 상속을 통해 부모-자식 관계가 존재한다.

부모 예외가 위에 있으면 자식 예외는 발생할 수 없음.

Exception 은 ArithmeticException, ArrayIndexOutOfBoundsException의 조상이기 때문에 위에서 먼저 잡혀서 오류가 잡힐 수 없는 구조이기 때문에 에러가 발생한다.

ex) ArithmeticException의 상속관계

출처 : https://docs.oracle.com/javase/7/docs/api/java/lang/ArithmeticException.html

Checked Exception vs Unchecked Exception

checked exception :

  • 컴파일러가 확인 후 문제가 발생할 것 같은 코드에 컴파일 에러를 발생
  • 외부 요인에 의해 발생할 수 있는 Exception
  • exception에서 runtime을 제외한 나머지 (ex)IOException : 파일에서 데이터를 읽고 쓸때 예외적인 상황 많이 발생)
  • IOException이 발생할 수 있으므로 반드시 예외처리를 해줘야한다는 에러 발생
  • 반드시 예외에 대한 조치(throws, catch)를 통해 처리해줘야함

 

unchecked exception :

  • RuntimeException을 상속하는 클래스
  • 명시적인 예외처리를 강제하지는 않음(컴파일에러 발생 X)
  • 내부 요인에 의해 발생할 수 있는 Exception
  • 런타임에서 에러를 확인할 수 있기 때문에 컴파일 단계에서 미리 예외를 체크할 수 없다.
  • ex) ArithmeticException, IndexOutOfBoundsException