자바의 정석 - 08.예외처리

MIRA KIM·2022년 11월 17일
0

자바의정석

목록 보기
1/1

예외처리

  1. 프로그램 오류
  • 에러의 종류
에러종류설명예시
컴파일 에러컴파일 시 발생하는 에러오타나 잘못된 구문
런타임 에러실행 시 발생하는 에러null을 참조하거나 없는 index호출
논리적 에러실행은 되지만 의도와 다르게 동작재고가 음수, 게임상 버그
  • 에러와 예외
종류설명예시
에러수습될 수 없는 심각한 오류메모리부족
예외수습될 수 있는 미약한 오류NPE

  1. 예외 클래스의 계층구조


출처 : https://github.com/mingseok/javajungsuk3/blob/master/ppt/%5BJava%EC%9D%98%EC%A0%95%EC%84%9D%5Dch8_%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ppt

  • Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
  • RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외

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

  1. Try-catch문에서의 흐름
  • try블럭에서 예외가 발생하면, 발생한 예외를 처리할 catch블럭을 찾는다.
  • 첫번째 catch블럭부터 순서대로 찾아 내려가며, 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
  • 예외의 최고 조상인 Exception을 처리하는 catch블럭은 모든 종류의 예외를 처리할 수 있다.(반드시 마지막 catch블럭이어야 한다.)
try {
	System.out.println(1);
}catch(Exception e){
	System.out.println(2);
}
System.out.println(3);
  • 예외 발생시 실행 순서 1 > 2 > 3
  • 예외가 발생하지 않았을 떄 : 1 > 3

  1. 예외발생과 catch 블록
  • 첫번째 catch블럭부터 순서대로 찾아 내려가며, 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
  • catch 는 instanceof가 true일때 실행
  • 자주 사용하는 예외 메서드
    • printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
    • getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻울 수 있다.
  • 멀티 catch 블럭 : |을 사용하여 여러 예외를 하나로 합칠수 있음 - 단 조상클래스와 함께 사용할수는 없음
catch (NullPointerException | ArrayIndexOutOfBoundsException e)

  1. 예외 발생시키기
NullPointerException e = new NullPointerException();
throw e;

throw new NullPointerException();
  • unchecked 예외 : 컴파일러가 예외처리를 확인하지 않는 RuntimeException
  • checked 예외 : 예외처리를 확인하는 Exception 클래스들

  1. 메서드에 예외 선언하기
public void sample() throws NullPointerException, ArrayIndexOutOfBoundsException{
	}
  • 자신을 호출한 메서드에 예외를 전달
public void main() {
		sample();
		
		try {
			sample2();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void sample() throws NullPointerException, ArrayIndexOutOfBoundsException{
		// 예외처리할 필요가 없음 unchecked 예외
	}
	public void sample2() throws IOException{
		// 예외처리 필요 !  checked 예외
	}

  1. Finally 블록
  • 예외의 발생여부와 관계없이 실행되어야 하는 코드를 넣는다.

  • 선택적으로 사용할 수 있으며, try-catch-finally의 순서로 구성된다.

  • 예외 발생시, try → catch → finally의 순서로 실행되고
    예외 미발생시, try → finally의 순서로 실행된다.

  • try 블럭에서 return 문이 실행되는 경우에도 finally 블럭의 문장들이 먼저 실행된 후에 현재 실행중인 메서드를 종료한다.
    이와 마찬가지로 catch블럭의 문장수행중에 return문을 만나도 finally의 문장들은 수행된다. (예제 8-19 참조)


  1. 자동 자원 반환 try-with-resources 문
  • 자원반환이 필요한 경우 코드가 지저분해지는 것을 막기 위해 사용할 수 있음
    - 단 자원이 AutoCloseable 를 상속받은 경우만 가능
  • 예외가 발생하든 발생하지 않든 자원을 close함
try(FileInputStream inputStream  = new FileInputStream("")){
			
}catch (Exception e) {
		
}

  1. 사용자정의 예외 만들기
  • Exception이나 RuntimeException을 상속받아 사용자 정의 예외를 만들 수 있음
  • 최근엔 unchecked 예외(RuntimeException을)를 상속받는 경우가 많아짐 : 코드의 복잡성을 낮추기 위해

  1. 예외 되던지기(exception re-throwing)
public void main() {
	
	try {
		sample();
	} catch (Exception e) {
		System.err.println("호출한 메서드에서 예외처리를 한번 더");
	}
}

public void sample() throws Exception{
	try {
		
	}catch(Exception e){
		System.err.println("에러 발생");
		throw e;
	}
	
}
  • 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 예외를 처리해야 하는 경우에 사용.

  1. 연결된 예외(chained exception)
public void main() {
	
	try {
		sample();
	} catch (Exception e) {
		e.getCause(); //원인 예외를 반환
	}
}

public void sample() throws Exception{
	
	try {
		
	}catch(NullPointerException e){
		Exception e1 = new Exception();
		e1.initCause(e); //지정한 예외를 원인 예외로 등록
		throw e1;
	}
	
}
  • 사용이유
    • 여러가지의 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서
    • checked 예외를 unchecked 예외로 변경할 수 있어서

0개의 댓글