Loading... 在Java编程中,当你尝试构造或使用一个不正确格式的URI(统一资源标识符)时,可能会遭遇 `java.lang.IllegalArgumentException: Invalid uri`异常。这个错误表明你提供的URI字符串不符合规范,可能是由于编码错误、无效字符、遗漏重要部分或查询参数组织不当等。 为了解决这个问题,首先需要理解URI的结构。一个标准的URI通常包括以下部分:协议(如http, https),主机名,端口号(可选),路径,以及查询字符串。URI有严格的格式要求,而且部分字符在URI中有特殊含义,它们需要被编码(例如空格转换为 `%20`)。 下面是常见问题和修复建议: **1. 仔细检查URI字符串是否完整。** 确认协议(如http或https)是否已经包括在你的字符串中,而且格式正确。 **2. 确保没有非法字符。** 对URI部分使用 `URLEncoder`类进行编码,特别是查询参数值。 **3. 对查询参数进行正确编码。** 在Java中,使用 `java.net.URLEncoder.encode(String s, String encoding)`方法对所有参数进行编码。指定编码通常为"UTF-8"。 **4. 使用URI/URL构建器类。** 大多数现代Java HTTP客户端库(如Apache HttpClient、Spring's RestTemplate或OkHttp)提供了URI/URL构建器工具,这些工具可以自动处理特殊字符的编码问题。 **5. 参数值不要为null。** 在构建查询字符串时,确保没有一个键对应的值为null,这将导致非法的URI字符串。 **6. 分隔符的使用必须正确。** 路径和查询参数之间用问号(?)分隔,而多个查询参数之间使用和号(&)分隔。 下面是一个处理URI编码问题的示范代码,使用Java标准库进行操作: ```java import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; public class URIFixer { public static void main(String[] args) { try { String baseUri = "https://api.example.com/data"; String queryParam1 = "param1 value"; String queryParam2 = "param2&value"; // 对查询参数进行编码 String encodedQueryParam1 = URLEncoder.encode(queryParam1, StandardCharsets.UTF_8.name()); String encodedQueryParam2 = URLEncoder.encode(queryParam2, StandardCharsets.UTF_8.name()); // 构建安全的URI,避免非法字符 URI uri = new URI(baseUri + "?param1=" + encodedQueryParam1 + "¶m2=" + encodedQueryParam2); // 使用URI System.out.println(uri.toString()); } catch (URISyntaxException e) { // 异常处理逻辑 e.printStackTrace(); } catch (Exception e) { // 其他异常处理 e.printStackTrace(); } } } ``` 以上示例代码演示了如何使用 `URLEncoder`和 `URI`类来构建有效的URI字符串。通过编码查询参数并按正确的格式构建URI,可以避免 `java.lang.IllegalArgumentException: Invalid uri`异常。 如果你使用特定的HTTP客户端库,它通常会为你提供内建的URI构造器或者编码工具来简化这个过程。 最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。 #### [云服务器/高防CDN推荐](https://www.tsyvps.com/) #### [蓝易云](https://www.tsyvps.com/)国内/海外高防云服务器推荐 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.tsyvps.com" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://www.8kiz.cn/img/6.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">蓝易云-五网CN2服务器【点我购买】</p> <div class="inster-summary text-muted"> <span style='color: red;'>蓝易云采用KVM高性能架构,稳定可靠,安全无忧!<br>蓝易云服务器真实CN2回国线路,不伪造,只做高质量海外服务器。</span> </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> --- **<span style='color:#000000'>海外免备案云服务器链接:[www.tsyvps.com](https://www.tsyvps.com)</span>** **<span style='color:#000000'>蓝易云安全企业级高防CDN:[www.tsycdn.com](https://www.tsycdn.com)</span>** **<span style='color:#DC143C'>持有增值电信营业许可证:B1-20222080【资质齐全】</span>** **<span style='color:#DC143C'>蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。</span>** --- #### **百度搜索:[蓝易云](https://www.baidu.com/s?ie=UTF-8&wd=%E8%93%9D%E6%98%93%E4%BA%91)** 最后修改:2023 年 12 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏