
inetaddress.getallbyname 仅支持纯域名(如 google.com),不接受带协议的完整 url(如 https://google.com);需先提取域名部分再调用,否则会抛出 unknownhostexception。
inetaddress.getallbyname 仅支持纯域名(如 google.com),不接受带协议的完整 url(如 https://google.com);需先提取域名部分再调用,否则会抛出 unknownhostexception。
InetAddress.getAllByName() 是 Java 网络编程中用于执行 DNS 正向解析的核心方法,它接收一个主机名(hostname)字符串,并返回该主机对应的所有 IPv4/IPv6 地址。但需特别注意:该方法不解析 URL,只解析符合 DNS 规范的域名(即不含协议、端口、路径或查询参数的纯主机名)。
你代码中的 "https://google.com" 是一个完整的 URI,而 https:// 属于协议方案(scheme),不是合法的 DNS 主机名。JVM 的底层解析器会尝试将整个字符串作为主机名进行 DNS 查询,自然失败并抛出 UnknownHostException。
✅ 正确做法是:先从 URL 中提取域名(host)。推荐使用 java.net.URL 类安全解析:
import java.net.*;
public class Main {
public static void main(String[] args) throws Exception {
String urlString = "https://google.com";
URL url = new URL(urlString);
String host = url.getHost(); // 自动提取 "google.com"
InetAddress[] addresses = InetAddress.getAllByName(host);
System.out.println("Resolved IP addresses for " + host + ":");
for (InetAddress addr : addresses) {
System.out.println(" → " + addr.getHostAddress());
}
}
}
⚠️ 注意事项:
- url.getHost() 已自动处理常见情况(如 https://www.example.com:8080/path → "www.example.com");
- 若 URL 格式非法(如缺少协议),构造 URL 对象时会抛出 MalformedURLException,建议加 try-catch;
- 某些特殊 URL(如含用户信息 user@host 或 IPv6 字面量 [::1])需额外校验,生产环境建议配合 java.net.URI 进行更健壮的解析;
- getAllByName(null) 会返回本机所有网络接口地址,但传入空字符串或非法格式仍会报错。
? 小结:DNS 解析与 URL 解析是两个不同层级的任务——前者交由 InetAddress,后者应由 URL 或 URI 类完成。始终确保传递给 getAllByName() 的是纯净、可解析的域名字符串。










