우리가 만든 예외를 사용자에게 던지는 방법
원하는 지점에 예외상황을 만들어서 오류를 만들어 낼 수 있다.
throw
는 예외를 발생시키는 명령어이다. throw
뒤에는 예외 정보를 가지고 있는 예외 클래스가 위치한다.
public void divide(){
if(this.right == 0){
//this.right에 0이 들어오면 프로그램이 중지되면서 예외상황으로 ""안의 문구가 나타난다.
throw new ArithmeticException("0으로 나누는 것은 허용되지 않습니다.");
}
try {
위의 메소드를 사용하는 메소드에서 try-catch를 이용하여 예외를 잡아낼 수 있다. 자바가상머신은 위의 예외클래스를 기준으로 어떤 catch 구문을 실행할 것인지를 결정한다. 또 실행되는 catch 구문에서는 예외클래스를 통해서 예외 상황의 원인에 대한 다양한 정보를 얻을 수 있다. 이 정보를 바탕으로 문제를 해결하게 된다.
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
try{
c1.divide();
} catch (ArithmethicException e){
System.out.println(e.getMessage());
}
}
}
//result
0으로 나누는 것은 허용되지 않습니다.
자바에서는 기본적으로 제공하는 예외 (표준 예외 클래스)가 있다. 이러한 예외들은 자바 가상 머신이 사용하기도 하고 응용 프로그램 개발자가 사용할 수도 있다. 클래스 Exception을 자바 API 문서에서 찾아보고 하위 클래스로 어떤 것들이 있는지 살펴볼 수도 있다. 아래는 주요 Exception 리스트들이다. (Effective java p.388)
: 모든 예외들의 부모
중요한 예외 클래스들은 아래와 같다.
상속 관계를 그림으로 나타내면 아래와 같다.
예외 클래스들의 공통된 조상이다. 모든 예외 클래스들이 가지고 있는 공통된 메소드를 정의하고 있다. 중요한 역할을 하지만 이 클래스를 직접 사용하지는 않기 때문에 우리에게는 중요하지 않다.
애플리케이션의 문제가 아니라 자바 가상 머신 자체적인 문제이기 때문에 애플리케이션이 할 수 있는 것은 없다. 애플리케이션을 구동시키기에는 메모리가 부족한 경우가 이에 속한다. 애플리케이션 개발자가 할 수 있는 것은 없기 때문에 따로 예외처리를 하지 말고 그냥 에러로 인해서 동작이 중단되도록 내버려둔다. 대신 자신의 애플리케이션이 메모리를 과도하게 사용하고 있다면 로직을 변경하거나 자바 가상머신에서 사용하는 메모리의 제한을 변경하는 등의 대응을 한다.
exception을 만들어서 사용할 때 이 둘을 구분해서 만들어야 한다.
FileNotFoundException
)package org.opentutorials.javatutorials.Exceptions;
class DivideException extends RuntimeException {
public int right;
public int left;
DivideException () {
super();
}
DivideException (String msg, int left, int right) {
super(msg);
this.left = left;
this.right = right;
}
}
class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void divide(){
if(this.right == 0){
throw new DivideException("0으로 나누는 것은 허용되지 않습니다.", this.left, this.right);
}
System.out.print(this.left/this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 0);
try {
c1.divide();
} catch (DivideException e){
System.out.println("두 번째 숫자로 " + e.right + "를 입력하셨습니다.");
System.out.println(e.getMessage());
}
}
}
//result
두 번째 숫자로 0를 입력하셨습니다.
0으로 나누는 것은 허용되지 않습니다.
class DivideException extends Exception {
DivideException(){
super();
}
DivideException(String message){
super(message);
}
}