我怎样才能创建一个静态的最终java.net.URL?

Sup*_*tar 8 java static constructor compiler-errors

我的问题很简单.我正在尝试创建一组java.net.URLs public static final,以便任何类都可以从任何上下文访问它们,因为这些URL在运行时不会更改.但是,当我尝试创建它们时,我收到编译器错误,告诉我必须捕获或声明抛出a java.net.MalformedURLException,但这在方法之外是不可能的.有没有办法绕过这样一个抛出非java.langThrowable的构造函数?

下面的一些虚拟代码可视化我的问题:

public class Main
{
    public static final java.net.URL STATIC_URL = new java.net.URL("http://example.com/");
    public static void main(String[] args)
    {
        GUI gui = new GUI();
        gui.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)
public class GUI extends java.awt.Window
{
    public GUI()
    {
        add(new java.awt.Label(Main.STATIC_URL.toString()));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你试图编译它,它会告诉你,你不能因为第3行.因此我的问题.

bez*_*max 17

一个"替代",我更喜欢@HosamAly方法:

private static final java.net.URL STATIC_URL = makeUrl("http://www.example.com");

public static java.net.URL makeUrl(String urlString) {
    try {
        return new java.net.URL(urlString);
    } catch (java.net.MalformedURLException e) {
        return null; //Or rethrow an unchecked exception
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,静态初始化的"最快"方式将是@HosamAly提出的方法.但是,为了使它比我的解决方案更快 - 您需要在一个try-catch块中捆绑尽可能多的URL初始化.原因是try-catch操作有点资源.因此,如果你对每个**变量使用try-catch,它会比将它们全部捆绑到一个try-catch块中慢一些.但是,我个人更喜欢清晰易懂的代码.在实际尝试在一个try-catch块中初始化多个URL后,您将看到我的意思. (2认同)

Hos*_*Aly 13

使用静态初始化程序:

public class Main {
    private static final java.net.URL STATIC_URL;
    static {
        java.net.URL temp;
        try {
            temp = new java.net.URL("http://www.example.com");
        } catch (java.net.MalformedURLException e) {
            temp = null;
        }
        STATIC_URL = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:需要使用临时变量来避免有关分配给最终静态字段两次的编译错误.如果字段不是final,则可以直接完成分配.

  • 我想看一个使用java.net.URI的建议.如果使用需要URL的库,请在此时使用toURL()方法. (2认同)

Tom*_*ine 7

如果您确定要硬连线URL.你确定吗?java.net.URL是JDK中最全面破解的类之一.关于用作"常量",涉及DNS查找并且它使用可变静态(尽管如果SecurityManager安装了安全检查,则由安全检查保护).

如果它只是一个,静态初始化器应该没问题.

private static final java.net.URL STATIC_URL;

static {
    try {
        STATIC_URL = new java.net.URL("http://example.com/");
    } catch (java.net.MalformedException exc) {
        throw new Error(exc);
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意,您不能使用类名限定静态字段名称.)

注意:你真的不想要null - 抛出某种错误并停止加载类.我已经做了常数,private因为它真的不是你想要依赖的东西.

如果您有很多,那么在定义的站点上使用公共代码和赋值的方法是合适的.

private static final java.net.URL STATIC_URL = constantURL("http://example.com/");

private static URL constantURL(String str) {
    try {
        return new java.net.URL("http://example.com/");
    } catch (java.net.MalformedException exc) {
        throw new Error(exc);
    }
}
Run Code Online (Sandbox Code Playgroud)

再次,没有空!

  • +1为no nulls.如果你的一个常数被炸毁,继续下去真的没有意义. (3认同)