[자바]예외 처리

allnight5·2022년 12월 1일
0

자바 개념정리

목록 보기
19/28

에러

프로그램 실행중 어떠한 원인에 의해서 오작동하거나 비정상적으로 종료되는 경우가 있는데 이러한 결과를 초래하는 원인을 프로그램오류 또는 에러라고 한다.
발생 시점에 따라 컴파일에러(compile-time error)와 런타임 에러(runtime error)로 나눌수있는데 컴파일 에러는 컴파일 할때 발생하는 에러이고 프로그램 실행도중 발생하는 에러를 런타임 에러라고한다. 컴파일도 잘되지만 의도한 것과 다르게 작동하는 경우는 논리적 에러(logical error)라고 한다.

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

에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될수 있는 다소 미약한 오류
메모리 부족이나 스택 오버플로우의 경우 발생하면 복구할 수없는 심각한 오류이고 예외는 발생하더라도 수습할수있는 미약한 오류이다.

예외 클래스의 계층구조

모든 클래스의 조상은 Object클래스이다.
모든 예외의 최고 조상은 Exception클래스이며 예외 클래스는 두그룹으로 나눠질수있다.
1. Exception클래스와 그 자손들
2. RuntimException클래스와 그 자손들

예외 처리(exception handling)의

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

try-catch(-finally)문에서의 흐름

try에서 예외가 발생할 경우.

  1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
  2. 일치하는 catch 블럭을 찾는 다면 catch 블럭 내의 문장들을 수행하고 전체 try-catch(-finnally)문을 빠져나가 그다음 문장을 계속해서 수행한다.
    2-1 일치하는 catch블럭을 찾지 못한다면 예외 처리는 되지못하여 실행이 중단된다.

try에서 예외가 발생하지 않는경우
1. catch 블럭을 거치지 않고 finally가 있다면 return형태여도 finally를 실행하고 try-catch(-finally)문을 빠져나가서 계속 수행한다.

try문에서 예외가 발생했을시 형변환이 가능한지 확인해주는 instanceof연산자를 이용하여 검사하게 되는데 검사 결과가 true인 catch문을 만날때까지나 catch문이 끝날때까지 계속되며 만났다면 예외처리를 해주지만 만나지 못하고 끝나버렸다면 오류가 발생하면서 비정상적인 종료가 이루어진다.

finally의 경우 try와 catch문에서 공통적으로 사용하는 코드를 넣어주면 된다.

무엇이 오류의 원인 인 것인지 확인하는법

printStackTrace()
예외 발생시 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()
발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
printStackTrace() 과 getMassage()를 이용하여 알수있다.
예시

catch(Exception e){
	e.printStackTrace();
    System.out.println(e.getMassage());
}

멀티 catch블럭

catch(ExceptionA e1){
	e1.printStackTrace();
}catch(ExceptionB e2){
	e2.printStackTrace();
}

위의 내용을 아래 와 같이 바꾸면 멀티 블럭이 된다

catch(ExceptionA e | ExceptionB e){
	e.printStackTrace();
}

그러나 A와 B가 조상과 자손 관계에 있다면 컴파일 에러가 발생한다.
그 이유는 조상과 자손관계라면 조상만 써주는것과 같기 때문에
불필요한 코드는 제거하라는 뜻에서 에러가 발생하는것이다.

catch(ExceptionA | ExceptionB e){
	if (e instanceof ExceptionA){
    	ExceptionA e1 = (ExceptionB)e;
        e1.methodA();
}

예외 발생시키기

1.연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다음
Exception e = new Exception("예외 실험");
2. 키워드 throw를 이용해서 예외를 발생시킨다'
throw e;

checked 예외, unchecked예외

예외 처리 계층에서 분류한 Exception 계층과 그 자손들(checked예외)이 발생할 가능 성 있는 문장들에 대해 예외 처리를 해주지 않으면 컴파일이 되지 않는다.
RuntimeException클래스와 그 자손(unchecked 예외)에 행당하는 예외 실행된다 그이유는 프로그래머가 실수로 발생하는 것들이기 때문에 예외처리를 강제하지는 않는다.
예외가 발생할 가능성이 있는 코드에도 예외 처리를 해야한다면 참조변수와 배열이 사용되는 모든 곳에 예외처리를 해주어야 할것이다.

메서드에 예외 선언하기

public static void main(String[] args) throws Exception{
	method1();
}
static void method1() throws Exception{
	method2();
}

static void method2() throws Exception{
	throw new Exception();// 예외 발생
}

메서드에 예외가 선언 되어있으면 Exception과 같은 checked 예외를 try-catch 문으로 처리하지 않아도 컴파일 에러가 발생하나 공간차지를 하게된다.

profile
공부기록하기

0개의 댓글