티스토리 뷰
목표
자바의 예외 처리에 대해 학습하기
스터디 목차
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
자바는 프로그램 실행 중에 발생할 수 있는 예외 처리 문을 제공한다.
자바의 예외 처리는 예외가 발생한 메서드 내에서 직접 처리하는 방법과 예외가 발생한 메서드를 호출한 곳으로 예외 객체를 넘겨주는 방법, 그리고 사용자 정의 예외를 생성하여 처리하는 방법이 있다.
예외(Exception)가 발생한 메서드 내에서 직접 처리 (try-catch-finally)
try 블록은 예외가 발생할 가능성이 있는 범위를 지정하는 블록이다. try 블록은 최소한 하나의 catch 블록이 있어야 하며, catch 블록은 try 블록 다음에 위치한다.
try{
// 예외 발생 가능성이 있는 문장들
}catch(예외 타입1 매개변수명) {
// 예외타입1의 예외가 발생할 경우 처리 문장들
}finally{
// 항상 수행할 필요가 있는 문장들
}
예외(Exception)가 발생한 메서드를 호출 한 곳으로 예외 객체를 넘기는 방법 (throws)
자바의 예외 처리 방법은 예외가 발생한 지점에서 직접 처리하지 않아도 예외가 발생한 메서드를 호출한 지점으로 예외를 전달하여 처리하는 방법이 있다.
public class ExceptionTest {
static void callDriver() throws ClassNotFoundException{ // callDriver를 호출한곳으로 예외 넘긴다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("완료");
}
public static void main(String args[]){
try{
callDriver();
}catch(ClassNotFoundException e){
System.out.println("클래스를 찾을 수 없습니다.");
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
System.out.println("시스템 종료.");
}
}
}
출처: https://hyeonstorage.tistory.com/203 [개발이 하고 싶어요]
사용자 정의 예외 생성 (throw)
사용자만의 예외 클래스를 작성하여 고의로 예외를 발생시킬 수도 있다.
사용자가 예외 클래스를 정의하려면 예외 클래스의 최상위 클래스인 java.lang.Exception 클래스를 상속받아 클래스를 정의한다.
public static void generateException() {
try{
if(...){
throw new Exception(); // 예외 발생
}
}catch(Exception e){
...
}
}
강제로 예외처리가 필요한 예외를 발생시킬 때에는 try-catch 문을 사용하든지 throws 키워드를 통해 밖으로 던져주어야 한다.
2. 자바가 제공하는 예외 계층 구조
모든 클래스의 조상은 Object 클래스이므로 Exception과 Error클래스 역시 Object 클래스를 상속받고 있다.
자바에서는 오류를 클래스로 관리하며 분류에 따라 크게 에러(Error)와 예외(Exception)로 나뉘고 예외는 또다시 그냥 예외(Exception)와 실행 예외(Runtime Exception)로 나뉘게 된다.
3. Exception과 Error의 차이는?
에러(Error)는 프로그램 레벨에서 대비할 수 없거나 복구 불가능한 치명적인 오류, 주로 JVM이 발생시킨다.
예외(Exception)는 오류가 발생했지만 대처 가능한 경우를 말하며 Exception 클래스 및 Exception 클래스의 하위 클래스를 말한다.
프로그램이 어떤 상황에서 예기치 못한 상황이나 원인에 의해 오작동하거나 비정상적으로 종료되는 경우를 프로그램 에러 또는 오류라고 한다.
에러는 크게 세가지로 분류가 가능하다.
- 컴파일 에러 - 소스코드의 잘못된 문법 구문이나 오타, 잘못된 자료형 사용 등에 의해 컴파일 시점에 발생하는 에러
- 런타임 에러 - 컴파일이 제대로 된 이후 프로그램이 실행 중 발생하는 에러 NullPointerException 같은 경우
- 논리적 에러 - 소스코드 레벨에서 발생하는 에러가 아닌 컴파일과 프로그램 실행상에도 문제가 없지만 개발자가 의도한 것과 다르게 동작하는 경우를 말한다.
4. RuntimeException과 RE가 아닌 것의 차이는?
- 일반예외 (Exception) - 특히 자바에서는 단순히 '예외'라고 하면 Exception 클래스를 상속받으면서 RuntimeException이 아닌 경우를 말한다. 반드시 처리해주어야 하는 예외들이다. 컴파일 시 예외를 체크하기 때문에 예외 처리를 하지 않을 경우 컴파일이 되지 않으며, 컴파일 시 체크한다고 해서 Checked Exception 이라고도 불린다.
- 실행 예외 (Runtime Exception) - 실행 예외는 Exception의 서브 클래스 중 RuntimeException을 상속받는 예외이다. 컴파일 시 체크하지 않기 때문에 Unchecked Exception이라고 하며 컴파일 시 발생하지 않고 프로그램 실행 중(Runtime)에 발생하는 예외이다. 이러한 예외들은 Checked 예외처럼 필수로 예외 처리를 강제하지 않는데, 이유는 if문 같은 조건절이나 Validation(유효성 검증) 코드를 통해 충분히 피할 수 있기 때문이다.
5. 커스텀한 예외 만드는법
프로그램의 스타일에 따라 예외로 처리해야 하는 경우, 사용자 정의 예외 클래스를 만들어 사용해야 한다.
사용자 정의 예외는 반드시 java.lang.Exception 클래스를 상속받아 정의해야 한다.
사용자 정의 예외는 JVM에서 예외를 발생시켜주지 않으므로 직접 예외를 생성해야 한다.
예외를 생성하는 방법 : throw new 사용자 정의 예외();
Unchecked(RuntimeException) 일 경우 RuntimeException 으로 상속 받고 따로 추가의 예외처리를 안해줘도 동작한다. (해주는게 좋음)
class DivideException extends RuntimeException {
DivideException() {
super();
}
DivideException(String message) {
super(message);
}
}
class Calculator {
...
...
public void divide(){
if(...){
throw new DivideException("0으로 나누는 것은 허용되지 않습니다.");
}
}
}
public class CalculatorDemo {
public static void main(String[] args){
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
c1.divide();
}
}
Checked(Exception) 일 경우 Exception을 상속받고 따로 try-catch 또는 throws를 이용하여 예외처리를 해줘야 함
class DivideException extends Exception {
DivideException() {
super();
}
DivideException(String message) {
super(message);
}
}
class Calculator {
...
...
public void divide(){
if(...){
try {
throw new DivideException("0으로 나누는 것은 허용되지 않습니다.");
} catch (DivideException e) {
e.printStackTrace();
}
}
}
}
public class CalculatorDemo {
public static void main(String[] args){
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
c1.divide();
}
}
Reference
opentutorials.org/course/1223/6226
'Live Study' 카테고리의 다른 글
[JAVA 스터디] 11주차 과제 : Enum (0) | 2021.01.25 |
---|---|
[JAVA 스터디] 10주차 과제 : 멀티쓰레드 프로그래밍 (0) | 2021.01.19 |
[JAVA 스터디] 8주차 과제 : 인터페이스 (0) | 2021.01.04 |
[JAVA 스터디] 7주차 과제 : 패키지 (0) | 2020.12.28 |
[JAVA 스터디] 6주차 과제 : 상속 (0) | 2020.12.24 |