예외(Exception)의 문법
- 예외는 프로그램을 만든 프로그래머가 상정한 정상적인 처리에서 벗어나는 경우에 이를 처리하기 위한 방법이다.
- try...catch는 예외에서 핵심적인 역할을 담당하는 문법적인 요소이고, 형식은 다음과 같다.
try {
예외의 발생이 예상되는 로직
} catch (예외클래스 인스턴스) {
예외가 발생했을 때 실행되는 로직
}
- try 안에는 예외 상황이 발생할 것으로 예상되는 로직을 위치시킨다.
- catch 안에는 예외가 발생했을 때 뒷수습을 하기 위한 로직이 위치한다.
- 프래그램이 실행될 때, try 부분에서 오류가 발생하는 순간 실행이 멈추고 catch에 있는 로직이 실행된다.
뒷수습의 방법
- 뒷수습을 하는 인스턴스 메소드에는 대표적으로 .getMessage(), .toString(), .printStackTrace()가 있다.
class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void divide(){
try {
System.out.print("계산결과는 ");
System.out.print(this.left/this.right);
System.out.print(" 입니다.");
} catch(Exception e){
System.out.println("\n\ne.getMessage()\n"+e.getMessage());
System.out.println("\n\ne.toString()\n"+e.toString());
System.out.println("\n\ne.printStackTrace()");
e.printStackTrace();
}
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
c1.divide();
}
}
위의 코드의 계산 결과는 다음과 같다.
계산결과는
e.getMessage()
/ by zero
e.toString()
java.lang.ArithmeticException: / by zero
e.printStackTrace()
java.lang.ArithmeticException: / by zero
at org.opentutorials.javatutorials.exception.Calculator.divide(CalculatorDemo.java:11)
at org.opentutorials.javatutorials.exception.CalculatorDemo.main(CalculatorDemo.java:25)
위에서 알 수 있는 사실은 다음과 같다.
- getMessage() : 오류에 대한 기본적인 내용을 출력해준다.
- toString() : getMessage()보다는 조금 더 자세하게 어떤 예외가 발생했는지 알려준다.
- printStackTrace() : 모든 예외 결과를 화면에 출력해준다. 가장 자세한 예외 정보를 알려준다.
다중캐치
- try 구문에서도 조건문의 else if처럼 여러 개의 catch를 사용할 수 있다. (중첩으로 사용할 수도 있음 !)
- 즉 catch에서 예외의 종류에 따라서 처리하는 다음 코드와 같이 로직을 다르게 구성할 수 있다.
try {
System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException"); //예외가 ArrayIndexOutOfBoundsException인 경우
} catch(ArithmeticException e){
System.out.println("ArithmeticException"); //예외가 ArithmeticException인 경우
} catch(Exception e){
System.out.println("Exception"); //예외가 위의 두 개를 제외한 다른 예외인 경우
finally
- finally는 try와 catch 뒤에 등장한다.
- 문법은 다음과 같다.
try {
예외의 발생이 예상되는 로직
} catch (예외클래스 인스턴스) {
예외가 발생했을 때 실행되는 로직
} finally {
예외 여부와 관계없이 실행되는 로직
}
throws
- throw는 예외처리를 다음 사용자에게 넘기는 것이다. 예시는 다음과 같다.
class B{
void run() throws IOException, FileNotFoundException{ //IOException, FileNotFoundException의 처리를 다음 사용자에게 넘기겠다는 의미 !
BufferedReader bReader = null;
String input = null;
bReader = new BufferedReader(new FileReader("out.txt"));
input = bReader.readLine();
System.out.println(input);
}
}
예외의 종류
- 자바가 기본적으로 제공하는 대표적인 예외에는 다음과 같은 것들이 있다.
| 예외 | 사용해야 할 상황 |
| IllegalArgumentException | 매개변수가 의도하지 않은 상황을 유발시킬 때 |
| IllegalStateException | 메소드를 호출하기 위한 상태가 아닐 때 |
| NullPointerException | 매개 변수 값이 null 일 때 |
| IndexOutOfBoundsException | 인덱스 매개 변수 값이 범위를 벗어날 때 |
| ArithmeticException | 산술적인 연산에 오류가 있을 때 |
checked, unchecked 예외
- checked 예외는 RuntimeException을 제외한 Exception의 하위 클래스들을 말한다.
- unchecked 예외는 RuntimeException을 말한다.
- checked 예외는 반드시 예외처리를 해야하고 unchecked 예외처리를 해도되고 안해도 무방하다.

- Throwable 은 범 예외 클래스들의 공통된 조상이다. 모든 예외 클래스들이 가지고 있는 공통된 메소드를 정의하고 있다.
- Error는 에플리케이션이 동작하는 가상머신에 문제가 생겼을 때 발생하는 예외다. 따라서 예외처리를 하지 말고 그냥 에러로 인해서 애플리케이션이 중단되도록 내버려둔다.
참고 : https://opentutorials.org/module/516/6226 (생활코딩 자바)
'Java > Java 정리' 카테고리의 다른 글
| [Java] static (0) | 2023.06.09 |
|---|---|
| [Java] 향상된 for 문 (0) | 2023.06.08 |
| [Java] 배열(Array) (0) | 2023.05.23 |
| [Java] 반복문 - while 문 (0) | 2023.05.18 |
| [Java] 반복문 - for 문 (1) | 2023.05.16 |