Java Socket连接URL报UnknownHostException与空指针异常咨询
问题结论
不需要优先修改Windows系统hosts文件,当前报错的核心原因是Socket初始化参数格式错误,和hosts配置无关。
报错原因拆解
- 第一处报错
java.net.UnknownHostException: https://socket.edu.net触发逻辑:Socket建立TCP连接时,主机名参数只接受纯域名/IP,不识别URL带的https://协议前缀。传入带前缀的字符串后,程序会把整个https://socket.edu.net当成主机名去做DNS解析,自然找不到对应IP,直接抛出主机未知异常。 - 第二处报错
java.lang.NullPointerException: Cannot invoke "java.io.DataInputStream.readLine()" because "this.input" is null是连锁问题:前一步TCP连接建立失败,绑定在连接上的输入流this.input没有完成初始化、值为null,此时调用readLine()方法就会触发空指针。
修复步骤
- 修正Socket初始化参数,去掉主机名里的协议前缀,同时确认服务端实际开放的Socket端口(和服务端配置保持一致即可),参考写法:
// 错误写法:主机名带协议前缀 // Socket socket = new Socket("https://socket.edu.net", 443); // 正确写法:仅传入纯域名 Socket socket = new Socket("socket.edu.net", 443);
- 参数修正后重新测试连接,如果此时仍然抛出主机未知异常,再检查本机DNS是否能正常解析
socket.edu.net域名。若DNS解析失败,再将该域名对应的正确IP添加到hosts文件(路径为C:\Windows\System32\drivers\etc\hosts),添加格式为[域名对应IP] socket.edu.net,修改hosts需要管理员权限。 - 补充连接异常捕获逻辑,确认Socket连接成功后再初始化输入、输出流,避免连接失败触发后续空指针。
Socket基础说明:
Socket支持同一设备或不同设备上两个独立进程间的通信,本质是借助标准Unix文件描述符与其他计算机通信的机制。Unix系统中所有I/O操作都通过读写文件描述符实现,文件描述符是与打开的文件关联的整数,可对应网络连接、文本文件、终端等对象。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

