【问题标题】:Checking for valid URL, URI construction检查有效的 URL,URI 构造
【发布时间】:2013-02-19 17:20:21
【问题描述】:

我有一个程序可以从网页上抓取链接,然后测试链接是否正常工作或损坏。我遇到的一点问题是确保 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,然后继续下一个链接。

对我可以做些什么来改进这一点有任何帮助吗?

【问题讨论】:

  • isValidURI(PingUrl.java:113) 这是第 113 行

标签: java validation url uri


【解决方案1】:

您得到一个 NPE,因为您捕获了一个异常 (MalformedURLException)然后继续执行更多代码,就好像什么都没发生一样

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

【讨论】:

  • 我只在获得有效 URL 时才设置 boolean validURI = true。如果它是假的,我不会对该 URL 做任何事情。我知道它为什么会抛出 MalformedURLException。所以你说的是如果它抛出错误,即使我没有对代码做任何其他事情,我也必须以某种方式处理它?抱歉,我对此有点陌生。
  • 啊,从头到尾,我没有像我想的那样理解它。我没有对创建此 url = new URL(checkUrl); 的错误做任何事情。我现在所做的是在尝试创建 uri 之前检查那里的错误。希望这可以减轻我遇到的所有问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2018-02-16
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2011-03-12
相关资源
最近更新 更多