본문 바로가기
Book

자바의 정석 - 자바 기본기 정리하기 (7)예외처리

by devLog by Ronnie's 2021. 11. 14.

들어가며


문제 구현에 있어서 자바에 대한 기본기의 부족함을 느껴서 오랜만에 자바의 기본 저서인 자바의 정석을 다시 피게 됐다. 그러면서 정말 신기한 경험을 하게 되었는데 바로 예전에 잘 이해가 안가서 읽고 넘어갔던 내용들이 이제는 내 머릿속에서 자연스럽게 그려지는 경험을 하게 되었다. 그동안에 시간들이 헛되지는 않았나보다.

 

어느 곳에서나 기본기는 중요하듯이 이번 기회를 통해 자바 기본기를 더 단단히 다지고자 챕터별로 글로 정리하면서 다시 한번 암기를 하고 좀 더 디테일하게 알아야 되는 곳은 챕터를 나눠서 자바의정석에 나온 내용 + 보강된 내용을 더해서 정리를 하고자 한다. 

 

정리


예외처리
컴파일 에러 - 컴파일 시에 발생하는 에러 -> 소스코드를 컴파일 하면 컴파일러가 소스코드에 대한 오타나 잘못된 구문, 자료형 체크 등의 기본적인 검사를 하여 오류가 있는지 알려준다. -> 컴파일이 성공적으로 마치고 나면 클래스 파일이 생성되고 생성된 클래스 파일을 실행할 수 있다.
런타임 에러 - 실행 시에 발생하는 에러 -> 컴파일이 완성됐다고 해서 프로그램의 실행시에도 에러가 발생하지 않는 것은 아니다. 이런 경우를 대비하고 자바에서는 실행 시 발생할 수 있는 프로그램 오류를 에러와 예외 두가지로 구분하였다. -> 에러는 프로그램 코드에 의해서 수습될 수 없는 심각한 오류이며 예외는 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류라 한다. 에러는 메모리부족이나 스택오버플로우와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다.
논리적 에러 - 실행은 되지만, 의도와 다르게 동작하는 것

예외 클래스의 계층 구조
모든 클래스의 조상은 Object이기에 Exception과 Error 클래스 역시도 Object 클래스의 자손이다.
계층
Object
Throwable
Exception                                                           Error
RuntimeException 런타임익셉션이 아닌 익셉션             OutOfMemoryError ...
Exception과 RuntimeException
Exception 클래스들 - RuntimeException 클래스들을 제외한 나머지 Exception 클래스, 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException - 프로그래머의 실수로 발생하는 예외 -> 예를 들어 배열 범위 벗어나는 에러 (ArrayIndexOutOfBoundsException),,

예외처리하기- try-catch문
프로그램의 실행 도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다.
예외처리란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외에 발생에 대비한 코드를 작성하는 것이다. 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것이 목적이다. 발생한 예외를 처리하지 못하면 프로그램은 비정상적으로 종료되며 처리되지 못한 예외는 JVM의 예외처리기(UncauaghtExceptionHandler)가 받아서 예외의 원인을 화면에 출력한다.
try {
 // 예외가 발생할 가능성이 있는 구문
} catch (Exception1 e1) {
 // Exception1이 발생했을 경우, 이를 처리하기 위한 문장
} catch (Exception2 e2) {
 // Exception2이 발생했을 경우, 이를 처리하기 위한 문장
} catch (Exception3 e3) {
 // Exception3이 발생했을 경우, 이를 처리하기 위한 문장
}  --> 이처럼 여러개 가능. 이 중 발생한 예외의 종류와 일치하는 단 한개의 catch블럭만 수행된다. 발생한 예외의 종류와 일치하는 catch블럭이 없다면 예외는 처리되지 않는다. 

 


예외처리 흐름
try문에서 처리도중 예외가 발생하게 되면 해당 예외처리 catch문으로 가서 실행 후 끝나기 때문에 try문의 예외가 발생한 코드의 아래 코드들은 실행되지 않는다.

캐치 블럭
catch블럭의 괄호내의 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연사자를 이용해서 검사하게 되는데 결과가 true인 캐치블럭을 만날때까지 검사는 계속된다. 이때 모든 예외클래스는 Exception클래스의 자손이므로 catch블럭의 괄호에 Exception클래스를 선언해놓으면 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해 처리된다. 

printStackTrace()와 getMessage()
예외가 발생했을때 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨 있으며 printStackTrace()와 getMessage()를 통해서 이 정보들을 얻을수 있다. catch블럭에 선언된 참조변수를 통해서 이 인스턴스에 접근할 수 있다
printStackTrace() - 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() - 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을수 있다.

예외발생시키기
키워드 throw를 사용해서 고의로 예외를 발생시킬 수 있다.
사용법 - 고의로 발생시킬 예외 클래스의 객체를 만든 후 발생
throw new Exception("고의로 발생시킴");
다음과 같이 인스턴스를 생성할때 생성자에 String을 넣어주면 이 String이 Exception 인스턴스에 메시지로 저장된다.

finally 블럭
예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다. try-catch문 끝에 붙여서 사용된다. 

사용자 정의 예외 만들기
필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다. Exception 클래스나 RuntimeException 클래스를 상속 받아 만든다. 

댓글