What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

자바 throws와 throw

  • Throws
  • Throw


Throws

메소드를 정의할 때 잠재적으로 어떤 Exception이 발생할 수 있는지 명시

다음은 예제로 만든 InputEvent 클래스

public class InputEvent {
    private int x;
    private int y;

    public InputEvent(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void moveTo(int desX, int desY) throws NumberFormatException {
        if (desX < 0 || desY < 0) {
            throw new NumberFormatException("It's not allowed a number under 0 : (x: "
                    + desX + ", y: " + desY + ")");
        }
        this.x = desX;
        this.y = desY;
    }
}

moveTo() 메소드의 정의에 throws NumberFormatException라고 정의

사용할 때 다음과 같이 catch와 함께 사용

InputEvent event = new InputEvent(10, 20);
try {
    event.moveTo(-1, -2);
} catch (NumberFormatException e) {
    // TODO
}


Throw

고의로 Exception을 발생시킬 때 사용

다음은 인자로 전달된 문자를 Integer로 변환하는 Integer.parseInt()

public static int parseInt(String s, int radix) throws NumberFormatException
{
    if (s == null) {
        throw new NumberFormatException("null");
    }
    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException("radix " + radix +
                " less than Character.MIN_RADIX");
    }
}

숫자가 아닌 문자열을 인자로 전달받으면 NumberFormatException을 throw하고, 이를 어플리케이션에서 적절히 처리하지 못하면 종료

만약 Integer.parseInt() 사용 시, Exception 발생으로 인해 어플리케이션이 종료되지 않게 하려면 다음과 같이 catch로 예외 처리

String numStr = "11a";
int sum = 0;
int num = 0;
try {
    int num = Integer.parseInt(numStr);
    sum = sum + num;
} catch (NumberFormatException e) {
    // catch exception
    throw new IllegalArgumentException("This string is not a number format");
} catch (IllegalArgumentException e) {
    // catch exception
}

Java는 IllegalArgumentException, NumberFormatException 등의 Exception을 기본적으로 제공하지만 다음과 같이 직접 Exception을 정의할 수도 있음

public class InvalidNumberException extends Exception {
    public InvalidNumberException(String message) {
        super(message);
    }
}


댓글남기기