检查有效的URL,URI构造

时间:2013-02-19 17:20:22

标签: java validation url uri

我有一个程序可以从网页上删除链接,然后测试链接是否正常工作或是否已损坏。我遇到一点麻烦的一点是确保URL实际上是有效的。

有问题的链接只是为了确保网站从最终用户的角度正常运行。所以主要是http,https和mailto协议,我真的不确定我们是否使用其他协议,比如ftp,但我希望能够处理所有意外情况。

到目前为止,这是构建URI的代码。在此之前,我已经从其他页面中删除了链接:

private boolean isValidURI(String checkUrl){
    boolean validURI = false;
    checkUrl = "this could be a link for some reason.com"; //set to link you want to test
    //Decodes checkUrl - Some links may already be encoded. This sets everything to a default of non-encoded urls.
    try {
        checkUrl = URLDecoder.decode(checkUrl, "UTF-8");
    } catch (UnsupportedEncodingException e1) {
        e1.printStackTrace();
        System.out.println("Error 1: "+checkUrl);
    }
    //Encodes checkUrl, allows URLs with various characters.
    try {
        url = new URL(checkUrl);
    } catch (MalformedURLException e2) {
        e2.printStackTrace();
        System.out.println("Error 2: "+checkUrl);
    }

    try {
        uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());
        System.out.println(uri);
        validURI = true;
    } catch (URISyntaxException e3) {
        e3.printStackTrace();
        System.out.println("Error 3: "+checkUrl);
    }       

    return validURI;
}

我在这里遇到的问题是,如果我在没有有效协议的情况下放入链接,例如“这是link.com”我得到了

at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at xboxtools.PingUrl.isValidURI(PingUrl.java:106)
at xboxtools.PingUrl.setLinkStatus(PingUrl.java:47)
at xboxtools.PingUrl.<init>(PingUrl.java:28)
at xboxtools.LocaleTab.runLocaleActionPerformed(LocaleTab.java:179)
at xboxtools.LocaleTab$1$1.run(LocaleTab.java:71)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-2" java.lang.NullPointerException
at xboxtools.PingUrl.isValidURI(PingUrl.java:113)
at xboxtools.PingUrl.setLinkStatus(PingUrl.java:47)
at xboxtools.PingUrl.<init>(PingUrl.java:28)
at xboxtools.LocaleTab.runLocaleActionPerformed(LocaleTab.java:179)
at xboxtools.LocaleTab$1$1.run(LocaleTab.java:71)
at java.lang.Thread.run(Unknown Source)

基本上我想要做的是测试我刮的链接是否是有效的链接。如果不是,请将validURI设置为false,然后继续执行下一个链接。

有什么建议我可以做些什么来改进这个?

1 个答案:

答案 0 :(得分:2)

你得到一个NPE,因为你捕获一个异常(MalformedURLException),然后继续使用更多的代码,好像什么也没发生

你的问题与url验证无关,只是简单的调试。当遇到你不了解的情况时,你应该首先尝试使用一个体面的调试器来逐步执行你的代码。