Android 26+版本Volley请求抛出IllegalArgumentException问题求助
问题背景
你这段用Volley提交订单数据的代码在Android 26以下版本运行正常,但升级到26及以上版本时抛出了IllegalArgumentException,错误提示明确指出client参数为null——这是因为高版本的Volley(或者适配Android 8.0+的网络框架)新增了严格的参数非空校验,不允许请求参数的Map中存在null的key或value,而旧版本Volley没有这个限制。
问题分析
从错误栈可以看到,异常出现在Request.encodeParameters()方法中,这个方法会遍历你传入的参数Map,检查每一个键值对是否为null。在Android 26以下,Volley可能跳过了这个校验,所以即使参数为null也能正常发送请求;但高版本中这个校验被强制执行了,直接抛出异常终止请求。
具体修改方案
我们需要从两个层面解决这个问题:确保传入save()方法的参数本身不为null,同时在构建请求参数时做兜底的非空处理。
1. 提前校验传入的client参数
在调用save()方法前,先检查client是否为null,给它一个默认值(比如空字符串),避免传递null值:
if (data.getCount() > 0) { data.moveToFirst(); // 给client参数做非空兜底 String safeClient = client == null ? "" : client; do { save(orderId, safeClient, data.getString(0), data.getString(3), String.valueOf(finalCost), data.getString(4), longitude, latitude, "_", progressDialog); } while (data.moveToNext()); data.close(); mydb.clearCart(); }
2. 在getParams()中对所有参数做非空处理
为了彻底避免类似问题,建议对所有请求参数都做非空校验,将null替换为空字符串(或者根据后端要求设置合理的默认值):
protected Map<String, String> getParams() { Map<String, String> params = new HashMap<>(); // 对每个参数逐一做非空兜底 params.put("orderId", orderId == null ? "" : orderId); params.put("client", client == null ? "" : client); params.put("name", prodid == null ? "" : prodid); params.put("seller", Seller == null ? "" : Seller); params.put("amount", amount == null ? "" : amount); params.put("quantity", quantity == null ? "" : quantity); params.put("longitude", String.valueOf(longi)); params.put("latitude", String.valueOf(lat)); params.put("location", location == null ? "" : location); return params; }
3. 额外检查:确认client参数的来源
你还需要排查client参数是从哪里获取的——为什么在Android 26+版本中会变成null?比如是不是权限变更导致无法读取用户信息?或者SharedPreferences、SQLite中的数据读取异常?找到根源可以从根本上避免这个问题。
为什么低版本没问题?
旧版本的Volley库没有对请求参数的null值做强制校验,即使参数为null也会尝试编码发送;而Android 8.0(API 26)之后,Volley适配系统的网络安全要求,新增了参数非空校验逻辑,所以之前隐藏的null参数问题就暴露出来了。
内容的提问来源于stack exchange,提问作者The Only Smart Boy

