(参考这篇文章: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不正确,程序应该崩溃,因为这将是一个编程错误,所以在构造函数中捕获异常会是错误的,不是吗?
解决这个问题的最佳方法是什么?
答案 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当然不会期待它。