我刚刚对 InetAddress 类做了一些实验,还阅读了它的 javadocs。
在第一次触摸后,我可以告诉我在 2 种情况下得到 UnknownHostException:当我传递非法格式的字符串(如 http://stackoverflow.com 而不是 stackoverflow.com)或当我传递无法在浏览器中解析的 URL 时(比如aosjdfk23423.com)。
这两种情况都记录在 javadocs 中(尽管在任何地方都没有明确说明对参数格式有任何严格要求)。以下是相关的 javadocs 部分:
主机名可以是机器名,例如
java.sun.com,或其文本表示
IP地址。如果提供了文字 IP 地址,则只有
检查地址格式的有效性。
@exception UnknownHostException 如果没有 IP 地址
可以找到host,或者如果指定了 scope_id
用于全球 IPv6 地址。
总结:
这行得通:
InetAddress.getByName("google.com");
InetAddress.getByName("74.125.87.99");
这会抛出UnknownHostException:
InetAddress.getByName("http://google.com");
InetAddress.getByName("unexistingresourse234234.com");
UPD(作为对 cmets 的回答:应该是这样的:
List<String> hosts = getPossibleHosts(); //these are all hosts you want to transform into inet addresses
final List<InetAddress> inetAddresses = new LinkedList<InetAddress>();
final List<String> badHosts = new LinkedList<String>();
for(String host : hosts) {
try {
inetAddresses.add(InetAddress.getByName(host));
} catch (UnknownHostException e) {
badHosts.add(host);
}
}
之后,您可以根据需要处理这两个列表。但是尝试将它们放在同一个列表中是错误的——它们不一样。