Технически это возможно. Например, рассмотрим следующую программу:
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
.
Прежде чем читать свой ответ, я никогда не знал о 'URL.setURLStreamHandlerFactory()'. Отлично. – kevinarpe