2011-10-14 64 views
3

一個直接的方法來檢查URL的有效性,是簡單地處理MalformedURLException例外:如何最優地檢查URL的有效性

try { 
    URL base = new URL(SomeString); 
} 
catch (MalformedURLException e) { 
    e.printStackTrace(); 
    // handles this in some way 
} 

但據我所知,用異常來實現程序邏輯概念不正確的(也許還有更多代價高昂的運行時性能)。

另一方面,我不知道一個Java方法,它的確如此isValid(String url)

是否有更好的方法來檢查的URL字符串有效性沒有實例化一個URL對象(和處理的MalformedURLException)?

+0

[如何檢查Java中的有效URL?](http://stackoverflow.com/questions/2230676/how-to-check-for-a-valid-url-in-java)可能有重複。請注意,沒有得到MalformedURLException並不能保證URL是有效的。 – Grodriguez

+0

@Grodriguez很好!但接受的答案是不可接受的......請參閱下面的性能考慮。 –

+1

值得注意的是,hibernate的UrlValidator(org.hibernate.validator.constraints.impl)只是捕獲異常以確定有效性。 – smp7d

回答

3

是的,寫一個正則表達式來檢查它。

Regular expression to match URLs in Java

+3

正則表達式很*很貴。但它比異常處理更昂貴嗎? (這裏的「昂貴」是指性能)+1 –

+0

我不確定,那需要一些測試(可能是一個很好的SO問題)。它似乎更優雅,但。 – smp7d

+0

我接受你的回答,因爲在檢查[URL Java源代碼](http://www.docjar.com/html/api/java/net/URL.java.html)後,我意識到異常處理可能是便宜。這是因爲實現URL避免了正則表達式。所以我想我得到了我需要的所有信息,以便做出明智的決定。 –

2

您可以移動功能的實用方法:URLUtils.isValid(url)你來自哪裏,catch返回false。之後你可以切換到另一種方法,如果你決定。

例如,您可以使用commons-validator的UrlValidator

+0

OP似乎在要求你提到的「更好的方法」。 – spork

+0

@spork - 而且我的答案中存在第二段 – Bozho

+0

@Bozho [UrlValidator](http://commons.apache.org/validator/apidocs/org/apache/commons/validator/UrlValidator.html)看起來不錯。我會檢查一下。 +1 –