TIL) Java - 예외처리

oatraspberry·2022년 12월 5일
post-thumbnail

예외처리

  • 예외처리: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것.
  • 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것.

/ 프로그램 오류 /

  1. 컴파일 오류(compile-time error): 프로그램 코드 작성 중 발생하는 문법적 오류
  2. 실행 오류(runtime error): 실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류
  • 에러 Error: 심각한 에러. 자바 가상 머신 자체에서 발생하는 오류. 개발자가 해결할 수 없는 오류. ex) OutOfMemoryError, ThreadDeath 등. cf) windows의 파란화면
  • 예외 Exception: 미약한 에러. 연산 오류, 숫자 포맷 오류 등과 같이 상황에 따라 개발자가 해결할 수 있는 오류
    • Exception과 그 자손클래스

      • 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
      • 일반 예외(Checked Exception): 컴파일 전에 체크

      Exception으로부터 바로 상속
      예외처리를 하지 않으면 컴파일 자체가 불가능함.

    • RuntimeException과 그 자손클래스

      • 프로그래머의 실수로 발생하는 예외
      • 실행 예외(Unchecked Exception): 실행시 체크

      RuntimeException으로부터 바로 상속
      예외처리를 하지 않아도 컴파일은 가능, 실행 중 예외가 발생하면 프로그램 종료

  1. 논리적 오류(logical error): 프로그램은 정상적으로 실행되나 잘못된 결과가 나오는 오류

자바 컴파일러

  1. 구문체크
  2. 번역
  3. 최적화

try-catch문

if문과 달리, try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 중괄호{}를 생략할 수 없다.

try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
    // 일반예외/실행예외 발생 가능 코드
} catch (예외클래스명 참조변수명) {
	// 예외클래스명 해당 예외가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception1 e2) {
	// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception1 eN) {
	// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} finally {
	// 예외 발생여부에 상관없이 무조건 실행블록, 생략 가능하다.
}
  • 예외가 발생했을 때
  1. 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
  2. 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면, 예외는 처리되지 못한다.
  • 예외가 발생하지 않은 경우
  1. catch 블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

예외의 발생과 catch 블럭

  • try 블럭에서 예외가 발생하면, 이를 처리할 catch 블럭을 찾아 내려감
  • 일치하는 catch 블럭이 없으면, 예외처리는 안 됨.
  • Exception이 선언된 catch 블럭은 모든 예외처리(마지막 catch 블럭)
try {
	System.out.println(3);
    System.out.println(0/0); // 0으로 나눠서 고의로 ArithmeticException을 발생시킴.
    System.out.println(4); // 실행되지 않는다.
} catch (Exception e) { // Exception -> ArithmeticException을 제외한 모든 예외가 처리됨. 모든 예외의 최고 조상. 모든 예외처리 가능.
	System.out.println("Exception");
}
System.out.println(5);

예외전가 throws

throws를 사용하여 예외처리 미루기
메서드 선언부에 throws를 추가
예외가 발생한 메서드에서 예외 처리를 하지 않고 이 메서드를 호출한 곳에서 예외 처리를 한다는 의미
main()에서 throws를 사용하면 가상머신에서 처리됨

  • 예외 전가 구조
리턴 타입 메서드명(입력 매개변수) throws 예외 클래스명 {
	// 예외 발생 코드
}

다중 예외 처리

하나의 catch 블록에서 여러 개의 예외처리 가능. 예외 타입을 OR(||)로 연결

try {
	// 예외 발생 가능 영역
}
catch(예외타입A || 예외타입B 참조변수명) {
	//
}

출처: 자바의 정석

profile
개발자가 될테야

0개의 댓글