4

(この投稿を参照: 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

4 に答える 4

7

それをキャッチして、AssertionError として再スローすることができます。

try {
    this.url = new URL(url);
}
catch(MalformedURLException e) {
    throw new AssertionError(e);
}
于 2012-12-21T19:28:32.240 に答える
2

RuntimeExpcetionある種の を投げるだけです (たとえばIllegalArgumentException)

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}
于 2012-12-21T19:28:45.000 に答える
1

通常、プログラマーエラーは「発生しない」ため、チェックされていない例外として報告する必要があります。そのため、クライアントクラスで例外をキャッチするように強制する必要はありません。

つまり、URLの作成をラップして、チェックされていない例外をスローする必要があります。

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

IllegalArgumentExceptionをスローすることは良い選択です。

于 2012-12-21T19:33:53.443 に答える
0

その例外をキャッチしたくないのはなぜですか?

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

この列挙型の最初のユーザーが例外に対して行うことは何ですか。IT は確かにそれを期待していません。

于 2012-12-21T19:28:01.610 に答える