2017-02-14 14 views

ответ

2

Технически это возможно. Например, рассмотрим следующую программу:

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.

+0

Прежде чем читать свой ответ, я никогда не знал о 'URL.setURLStreamHandlerFactory()'. Отлично. – kevinarpe