14

编辑:似乎我一开始听起来太生气了,这是一个返工。

我想创建一个 URL 常量,就像这样

public static final URL REMOTE_URL = new URL("http://example.com/");

但我不能因为构造函数抛出一个检查异常。现在我用

public static final URL REMOTE_URL = createUrl("http://example.com/");

private static URL createUrl(String url) {
    try {
        return new URL(url);
    } catch (MalformedURLException error) {
        throw new IllegalArgumentException(error.getMessage(), error);
    }
}

但这感觉就像重新发明轮子。我不可能是唯一一个想要使用 URL 常量的人,不是吗?所以我想知道是否有第三方工具箱库(如 guava 或 apache-commons,或其他任何东西),或者甚至更好的标准 Java 中包含这些设施的东西?当我们通过减小 util 包的大小来开始一个新项目时,这将对我有所帮助:)。

4

4 回答 4

8

这种抱怨一定很常见,因为 Java(从 1.7 开始)引入了 URI 类。这个类有两种构造方法:

  1. 使用 URI.new,它会抛出一个检查异常
  2. 使用 URI.create,它会引发未经检查的异常

对于已知来自安全来源的 URI/URL,您可以使用 URI.create() 变体,而不必担心捕获异常,因为您知道它不会被抛出。

不幸的是,有时您不能使用 URI,而您仍然需要 URL。没有将 URI 转换为不引发检查异常的 URL 的标准方法(到目前为止我已经找到)。

于 2019-11-19T23:13:47.877 回答
3

由于其他人只是在评论,我将提供答案,即没有标准的方法来做你想做的事:)

另外,由于您提到了 apache commons 和 google guava,我会指出标准也不是完全正确的词……也许您想要开源、免费或只是第三方。

于 2013-09-26T18:36:39.793 回答
1

只是把这个混在一起——为了完成同样的事情,有很多风格上的变化,这个在静态初始化块中初始化,但它不能是最终的。

public static URL g_url;

static {        

    try {
        g_url = new URL("http://www.example.org");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2013-09-26T19:22:02.843 回答
0

您不能扩展 URL,因为它是最终的,但您可以创建一个新类,可能命名为 MyURL,并让它将 URL 方法代理到私有(或受保护)URL 成员。

这是此类课程的开端:

package blammo.url;

import java.net.MalformedURLException;
import java.net.URL;

public class MyURL
{
    private URL containedURL;

    public MyURL(final String spec)
    {
        try
        {
            containedURL = new URL(spec);
        }
        catch (MalformedURLException exception)
        {
            throw new RuntimeException(exception);
        }
    }

    public String getAuthority()
    {
        return containedURL.getAuthority();
    }

    // required for stuff that needs a URL class.
    public URL getContainedURL()
    {
        return containedURL;
    }
}

于 2013-09-26T18:41:24.773 回答