我注意到不建议使用File.toURL()
,而建议使用File.toURI().toURL()
。 (我正在使用Java8。)
我看到URI.toURL()
可以抛出MalformedURLException
(扩展了IOException
)。
在什么情况下File.toURI().toURL()
可以引发异常?
最佳答案
从技术上讲,这是可能的。例如,考虑以下程序:
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
public class Test {
public static void main(String[] args) throws MalformedURLException {
URL.setURLStreamHandlerFactory(protocol -> {
throw new UnsupportedOperationException();
});
System.out.println(new File("/etc/passwd").toURI().toURL());
}
}
此处
toURL
调用实际上因MalformedURLException
失败:Exception in thread "main" java.net.MalformedURLException
at java.net.URL.<init>(URL.java:627)
at java.net.URL.<init>(URL.java:490)
at java.net.URL.<init>(URL.java:439)
at java.net.URI.toURL(URI.java:1089)
at com.example.Test.main(Test.java:20)
Caused by: java.lang.UnsupportedOperationException
at com.example.Test.lambda$main$0(Test.java:17)
at java.net.URL.getURLStreamHandler(URL.java:1142)
at java.net.URL.<init>(URL.java:599)
... 4 more
但是我怀疑如果您设置自定义
URLStreamHandlerFactory
甚至不支持file
方案,您的程序仍将正常运行。使用默认的
URLStreamHandlerFactory
,我无法思考或记住toURL
可能失败的情况,因此,如果您不喜欢URLStreamHandlerFactory
,则可以安全地使用它。如果您需要经常产生
URL
对象,则可以考虑创建如下这样的实用程序方法:public class FileUtils {
public static URL toURL(File file) {
try {
return file.toURI().toURL();
} catch (MalformedURLException e) {
throw new InternalError(e);
}
}
}
并在任何地方使用它。它只是断言
MalformedURLException
在您的程序中是不可能的,因此,如果它实际发生,它将被视为内部程序错误。另一种可能性是根本不使用
URL
类。对于许多目的,可以代替使用URI
类。