[英]How can I create a static final java.net.URL?
我的问题很简单。 我正在尝试创建一组public static final
的java.net.URL
,以便任何类都可以从任何上下文访问它们,因为这些URL在运行时不会更改。 但是,当我尝试创建它们时,我收到编译器错误,告诉我必须捕获或声明抛出java.net.MalformedURLException
,但这在方法之外是不可能的。 有没有办法绕过这样一个抛出非java.lang
Throwable的构造函数?
下面的一些虚拟代码可视化我的问题:
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);
}
}
public class GUI extends java.awt.Window
{
public GUI()
{
add(new java.awt.Label(Main.STATIC_URL.toString()));
}
}
如果你试图编译它,它会告诉你,你不能因为第3行。因此我的问题。
一个“替代”,我更喜欢@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
}
}
使用静态初始化程序 :
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;
}
}
注意:需要使用临时变量来避免有关分配给最终静态字段两次的编译错误。 如果该字段不是final
字段,则可以直接完成分配。
如果您确定要硬连线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);
}
}
(注意,您不能使用类名限定静态字段名称。)
注意: 你真的不想要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);
}
}
再次,没有空!
我编译它的唯一方法是删除final
并使用静态初始化程序块。
/**
*
*/
package com.neurologic.example;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author The Elite Gentleman
* @since 06 December 2011
*
*/
public class StaticUrlTest {
public static URL url = null;
static {
try {
url = new URL("http://www.google.com");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.