如何最优地检查URL的有效性

4

检查URL有效性的一种简单方法是,只需处理MalformedURLException异常:

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

但据我所知,使用异常来实现程序逻辑在概念上是不正确的(也许运行时性能更昂贵)。
另一方面,我不知道有没有一个Java方法可以执行isValid(String url)。
有没有更好的方法来检查URL字符串的有效性,而不需要实例化URL对象(并处理MalformedURLException)?

可能是重复的问题:如何在Java中检查一个有效的URL?。请注意,不会得到MalformedURLException并不意味着URL是有效的。 - Grodriguez
@Grodriguez 很好的发现!但是那里被接受的答案是不可接受的...请参考下面的性能考虑。 - Regex Rookie
1
值得注意的是,Hibernate的UrlValidator(org.hibernate.validator.constraints.impl)只是捕获异常来确定有效性。 - smp7d
1
取决于您认为什么是可以接受的 :-). 工作和缓慢总比不工作和快速好。我会先担心一个适当的解决方案,只有在这证明是应用程序中真正瓶颈时才会担心性能。例如,如果在验证后URL将用于建立网络连接,则正则表达式的成本绝对可以忽略不计。 - Grodriguez
2个回答

3

4
正则表达式的开销非常大。但它比异常处理更昂贵吗?(这里的“昂贵”是指性能方面)+1 - Regex Rookie
我不确定,这需要一些测试(可能是一个不错的SO问题)。不过它似乎更加优雅。 - smp7d
我接受你的答案,因为检查了 URL Java 源代码 后,我意识到异常处理可能更便宜。这是因为 URL 实现避免了正则表达式。所以我认为我已经得到了所有必要的信息,可以做出明智的决定。 - Regex Rookie

2
您可以将该功能移动到一个实用方法中:URLUtils.isValid(url),在catch中返回false。之后,如果您决定要切换到另一种方法,则可以这样做。
例如,您可以使用commons-validator中的UrlValidator

OP似乎在询问您所提到的“更好的方法”。 - spork
@spork - 我的回答第二段中存在一个。 - Bozho
@Bozho UrlValidator 看起来很不错。我会去看看的。+1 - Regex Rookie
如果URL类的设计者把解析逻辑移动到一个单独的.isValid(..)方法中就好了。 - Bozho
@Bozho 我刚刚检查了源代码,他们使用正则表达式来执行检查...那我最好自己实现这个方法。 :) - Regex Rookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接