자바 예외처리

백종현·2023년 3월 2일
0
post-custom-banner

프로그램 오류

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

  • 에러 : 프로그램 코드에 의해서 수습될 수 있는 심각한 오류
  • 예외 : 프로그램 코드에 의해서 수습될 수 있는 다수 미약한 오류

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

try-catch

  • try-catch문에서 예외가 발생한 경우,
  1. 발생한 예외와 일치하는 catch 블록 확인
  2. 일치하는 catch 블럭을 찾으면 catch내의 문장 수행, try-catch문을 빠져나와 다음 문장 수행. 일치하는 catch 문이 없으면 처리되지 못함.
  • try 블록 내에서 예외가 발생하지 않은 경우
  1. catch 블록을 거치지 않고 전체 try-catch 문을 빠져나가 수행을 계속함.

catch 블럭부터 차례로 내려가면서 catch블록의 괄호 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용하여 검사, 검사결과가 true인 catch블럭을 만날때까지 검사를 계속함.

printStackTrace()와 getMessage()

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

참고 : printStackTrace(PrintStream) or printStackTrace(PrintWriter s)를 통해 예외에 대한 정보를 파일에 저장 가능

멀티 catch 블록

'|' 기호를 사용해서 멀티 catch 블록 사용가능 (jdk 1.7)

try{
...
} catch(Exception | RunTimeException e) {
	// 처리
}

'|'로 연결된 예외 클래스가 조상/자손 관계면 컴파일 에러. e의 catch 블록의 공통 분모 조상 예외 클래스에 선언된 멤버만 사용 가능.

예외 발생

throw new Exception()

  • 컴파일러가 예외처리를 확인하지 않는 RuntimeException클래스들은 unchecked 예외
  • 예외처리를 확인하는 Exception클래스들은 checked 예외

RuntimeException은 프로그래머의 실수로 발생하기 때문에 예외처리 강제 X

메소드에 예외 선언

throws Exception
throws의 명시하는 것은 예외를 처리하는 것이 아닌, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것.

finally 블록

finally : 예외 관계없이 실행

자동 자원 반환 try-with-resources

jdk 1.7 부터 try-with-resources 제공

try (SomeResource resource = getResource()) {
    use(resource);
} catch(...) {
    ...
}

괄호 안에 객체 생성 문장을 넣으면, 이 객체는 close()를 호출하지 않아도 try 블록을 벗어나는 순간 자동으로 close() 호출.

public interface AutoCloseable {
    void close() throws Exception;
}

close()가 호출되려면 클래스가 이 인터페이스를 구현해야 한다.

사용자 정의 예외 만들기

exception을 상속하여 만들기

예외 되던지기

예외 처리를 나눠서 처리

class ExceptionEx17 {
	public static void main(String[] args) {
		try {
			method1();
		} catch (Exception e) {
			System.out.println("main메서드에서 예외가 처리되었습니다.");
		}
	}
	
	static void method1() throws Exception{
		try {
			throw new Exception();
		} catch (Exception e) {
			System.out.println("method1 에서 예외가 처리되었습니다.");
			throw e;
		}
	}
}
profile
노력하는 사람
post-custom-banner

0개의 댓글