♨학습내용
☞ 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
☞ 자바가 제공하는 예외 계층 구조
☞ Exception과 Error의 차이는?
☞ RuntimeException과 RE가 아닌 것의 차이는?
☞ 커스텀한 예외 만드는 방법
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 에러(Error)는 어쩔 수 없지만 예외(Exception)는 프로그래머가 이에 대한 처리를 미리 해주어야 한다.
- 예외 처리란, 이처럼 프로그램 실행 시 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이다.
- 예외처리의 목적은 예외 발생으로 인한 비정상적인 종료를 방지하고 정상적인 상태를 유지할 수 있도록 하는 것이다.
- try-catch
- 하나의 try 블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch 블럭이 올 수 있으며, 이 중 일치하는 단 하나의 catch 블럭만 수행된다.
- 하나도 일치하지 않는 경우에는 아무것도 수행되지 않는다.
- 즉, 예외가 처리되지 않아 비정상적으로 종료된다.
- 만약, try블럭의 로직에서 예외가 발생하지 않는 경우에는 전체 try-catch 문 이후의 로직이 수행된다.
try {
// 예외가 발생할 가능성이 있는 문장
} catch (발생할 수 있는 예외타입1 예외1) {
// 발생할 수 있는 예외타입1 이 발생했을 경우, 실행될 문장
} catch (발생할 수 있는 예외타입2 예외2) {
// 발생할 수 있는 예외타입2 이 발생했을 경우, 실행될 문장
}
public int divide(int leftOperand, int rightOperand) {
try {
return leftOperand / rightOperand;
} catch (ArithmeticException arithmetic) {
System.out.println("ArithmeticException");
} catch (Exception e) {
System.out.println("Exception");
}
}
- throw
- 키워드 throw를 사용하면, 프로그래머가 고의로 예외를 발생시킬 수 있다.
throw new RuntimeException("요청 형식이 맞지 않습니다.");
- Exception 인스턴스를 생성할 때, 생성자에 String을 넣어 주면, 이 String이 Exception 인스턴스의 메세지로 저장된다.
- 이 메세지는 .getMessage() 메서드를 이용해서 얻을 수 있다.
- throws
- 예외를 처리하는 방법에는 try-catch 문을 사용하는 것 외에, 예외를 메서드에 선언하는 방법이 있다.
- 메서드에 예외를 선언하는 방법은 메서드 선언부에 throws 키워드를 사용해서 메서드 내부에서 발생할 수 있는 예외를 적어주면 된다.
- 메서드를 호출한 곳으로 예외를 떠넘기는 방법이다.
public class tTest {
public static void main(String[] args) {
tTest test = new tTest();
try {
System.out.println(tTest.createException(10,0));
} catch (ArithmeticException e){
System.out.println("0");
}
}
public int createException(int num1, int num2) throws ArithmeticException {
return num1/num2;
}
}
- finally
- try-catch 과정에서 어떤 예외 상황 발생 여부와 상관없이 무조건 실행되는 영역이다.
public class FTest {
public static void main(String[] args) {
FTest test = new FTest();
try {
test.throwException();
} catch (ArithmeticException e){
System.out.println("Fail by Exception");
} finally {
System.out.println("finally Exception.");
}
System.out.println("Bye, Exception!");
}
public void throwException() throws RuntimeException {
throw new RuntimeException();
}
}
- throwException()은 리턴타입은 없지만, RuntimeException을 던지는 메서드이다.
- 메인 메서드에서 throwException()을 호출함으로써 예외가 발생했지만, catch에서 처리하지 못하면서 RuntimeException에 의해 프로그램이 중단된다.
- 프로그램이 비정상적으로 중단되는 바람에 try-catch 바깥의 코드는 실행되지 못했지만, finally 안의 코드는 예외 발생 여부와 상관없이 정상적으로 출력된다.
- 예외와 상관없이 무조건 실행되어야할 코드는 finally 안에 작성할 필요가 있다.
- 자바가 제공하는 예외 계층 구조
- 에러, 예외 클래스는 Throwable 클래스를 상속받는다.
- Java Exception클래스는 checked, unchked 클래스로 구분한다.
- 위에 그림에서 빨간색은 checked 예외, 파란색은 unchecked 예외 클래스에 해당한다.
- Exception과 Error의 차이는?
- Exception (예외)
- 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류를 말한다.
- 예외가 발생하더라도 프로그래머가 이에 대비한 적절한 코드를 작성하여 프로그램의 비정살 종료를 막을 수 있다.
- Error (오류)
- 메모리부족 (OutOfMemeryError) 이나 스택오버플로우 (StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류를 의미한다.
- 개발자는 예외에 대한 적절한 코드를 미리 작성해놓음으로써 프로그램의 비정상적인 종료를 막아야한다.
- RuntimeException과 RE가 아닌 것의 차이는?
- RuntimeException을 상속받는 예외는 Unchecked Exception이라고 하고,
- 상속받지 않는 예외는 Checked Exception이라고 한다.
- Unchecked Exception
- 말 그대로 체크가 불가능한 Exception이다.
- Checked Exception과는 반대로 자바에서 예외 처리를 강제화하지 않습니다.
class Main {
public static void main(String[] args) {
throw new RuntimeException(); // 이와 같이 RuntimeException을 던져도 컴파일상 문제 없음
}
}
- Checked Exception
- 체크가 가능한 Exception을 말하며 이를 자바는 강제로 예외 처리를 하라고 알려준다.
try {
throw new IOException(); // 예외를 던짐
} catch(Exception e) {
// 예외 핸들링..
}
- 커스텀한 예외 만드는 방법
- 기존에 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의할 수 있다.
- 예외처리가 필수인 경우에는 Exception 클래스를, 예외처리가 필수가 아닌 커스텀 예외는 RuntimeException을 상속받아 정의한다.
- 커스텀 예외 클래스는 생성자뿐만 아니라 필드, 메소드도 원하는 만큼 추가가 가능하다.
class CheckedException extends Exception {
CheckedException(String str) {
super(str);
}
}
class UnCheckedException extends RuntimeException {
UnCheckedException(String str) {
super(str);
}
}
'Study > Java_study' 카테고리의 다른 글
Java_study_11 (Enum) (0) | 2021.09.07 |
---|---|
Java_study_10 (멀티쓰레드 프로그래밍) (0) | 2021.08.30 |
Java_study_8 (인터페이스) (0) | 2021.08.17 |
Java_study_7 (패키지) (0) | 2021.08.11 |
Java_study_6 (상속) (0) | 2021.08.09 |