Mon application traite les URL saisies manuellement par les utilisateurs. J'ai découvert que certaines URL mal formées (telles que 'http:/non-valide') entraînent le rejet de NullPointerException lors de l'ouverture de la connexion. Comme j'ai appris de this Java bug report, le problème est connu et ne sera pas corrigé. La suggestion est d'utiliser java.net.URI, qui est "plus conforme à la RFC 2396".Comment vérifier que l'URL est valide dans Java 1.6?
La question est: comment utiliser URI pour contourner le problème? La seule chose que je peux faire avec URI est de l'utiliser pour analyser la chaîne et générer des URL. J'ai préparé le programme suivant:
import java.net.*;
public class Test
{
public static void main(String[] args)
{
try {
URI uri = URI.create(args[0]);
Object o = uri.toURL().getContent(); // try to get content
}
catch(Throwable e) {
e.printStackTrace();
}
}
}
Voici les résultats de mes tests (avec Java 1.6.0_20), pas très différent de ce que je reçois avec java.net.URL:
sh-3.2$ java Test url-not-valid java.lang.IllegalArgumentException: URI is not absolute at java.net.URI.toURL(URI.java:1080) at Test.main(Test.java:9) sh-3.2$ java Test http:/url-not-valid java.lang.NullPointerException at sun.net.www.ParseUtil.toURI(ParseUtil.java:261) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:795) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049) at java.net.URLConnection.getContent(URLConnection.java:688) at java.net.URL.getContent(URL.java:1024) at Test.main(Test.java:9) sh-3.2$ java Test http:///url-not-valid java.lang.IllegalArgumentException: protocol = http host = null at sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:151) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:796) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049) at java.net.URLConnection.getContent(URLConnection.java:688) at java.net.URL.getContent(URL.java:1024) at Test.main(Test.java:9) sh-3.2$ java Test http:////url-not-valid java.lang.NullPointerException at sun.net.www.ParseUtil.toURI(ParseUtil.java:261) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:795) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049) at java.net.URLConnection.getContent(URLConnection.java:688) at java.net.URL.getContent(URL.java:1024) at Test.main(Test.java:9)
Il devrait être Java 6 - Java 1.6 n'est plus utilisé officiellement. –
@ Péter Török Que vous dit java -version? La mienne dit 'version java '1.6.0_20" ' –
@Pete Kirkham, OTOH Je ne trouve pas de" JDK 1.6 "sur [Site Java de Sun] (http://java.sun.com/javase/downloads/index. jsp). –