我注意到 File.toURL()
已被弃用,取而代之的是 File.toURI().toURL()
。 (我正在使用 Java 8。)
我看到 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
类。
关于java - File.toURI().toURL() 怎么会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218058/