Замена устаревшего конструктора URL (контекст URL, спецификация строки), который также работает со старыми версиями JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Замена устаревшего конструктора URL (контекст URL, спецификация строки), который также работает со старыми версиями Java

Сообщение Anonymous »

Я думал, что эквивалентом нового URL(контекст URL, спецификация строки), который устарел в Java 21, будет context.toURI().resolve(спецификация строки).toURL(). Но те же результаты он дает только в Java 21. Если я использую более старую версию Java, например 17 или 11, я получаю другие результаты. Например, этот код

Код: Выделить всё

    URL context = new URI("http://example.com").toURL();
for (String spec : Arrays.asList("foo", "/foo", "http://foo.bar", "\\foo")) {
System.out.println(new URL(context, spec));
System.out.println(context.toURI().resolve(spec));
}
выдает этот результат в старых версиях Java

Код: Выделить всё

http://example.com/foo
http://example.comfoo
http://example.com/foo
http://example.com/foo
http://foo.bar
http://foo.bar
http://example.com/\foo
Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in path at index 0: \foo
at java.base/java.net.URI.create(URI.java:906)
at java.base/java.net.URI.resolve(URI.java:1089)
at Main.main(Main.java:10)
Caused by: java.net.URISyntaxException: Illegal character in path at index 0: \foo
at java.base/java.net.URI$Parser.fail(URI.java:2974)
at java.base/java.net.URI$Parser.checkChars(URI.java:3145)
at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3227)
at java.base/java.net.URI$Parser.parse(URI.java:3186)
at java.base/java.net.URI.(URI.java:623)
at java.base/java.net.URI.create(URI.java:904)
... 2 more
Последнее исключение выдается даже в Java 21. Я знаю, что это недопустимый URL-адрес, но я не контролирую ввод, и браузеры все еще работают с ним, поэтому мне приходится делать это тоже работает.

Подробнее здесь: https://stackoverflow.com/questions/790 ... or-that-al

Вернуться в «JAVA»