如何从枚举构造函数中抛出异常

时间:2012-12-21 19:24:08

标签: java exception constructor enums

(参考这篇文章:How to throw an exception from an enum constructor?

我真的很想做同样的事情。示例代码:

public enum PublicIPWebservice {
    AMAZON_WEB_SERVICES("http://checkip.amazonaws.com"),
    EX_IP("http://api-ams01.exip.org/?call=ip"),
    WHAT_IS_MY_IP("http://automation.whatismyip.com/n09230945.asp");

private URL url;

private PublicIPWebservice(String url) throws MalformedURLException {
    this.url = new URL(url);
}

public URL getURL() {
    return url;
}
}

如果url不正确,程序应该崩溃,因为这将是一个编程错误,所以在构造函数中捕获异常会是错误的,不是吗?

解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:7)

你可以抓住它并重新抛出AssertionError:

try {
    this.url = new URL(url);
}
catch(MalformedURLException e) {
    throw new AssertionError(e);
}

答案 1 :(得分:2)

我只会抛出某种RuntimeExpcetion(例如IllegalArgumentException

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}

答案 2 :(得分:1)

通常程序员错误必须报告为未经检查的异常,因为它“不会发生”所以不需要强迫自己捕获客户端类中的异常。

那说你应该包装url创建并抛出一个未经检查的异常。

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException ex) {
        throw new IllegalArgumentException("From input: " + url);
    }
}

抛出IllegalArgumentException是一个不错的选择。

答案 3 :(得分:0)

为什么不希望捕获该异常?

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        // surely you should handle the exception here
    }
}

此枚举的第一个用户与异常有什么关系。 IT当然不会期待它。