You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中String.format()无改动崩溃,Volley请求异常求助

排查Volley请求中String.format导致的MissingFormatArgumentException崩溃

这个问题我之前碰到过!咱们一步步来拆解排查:

首先看错误日志,MissingFormatArgumentException: Format specifier '%s'的本质是:String.format解析你的URL模板时,要么发现有格式说明符(比如%s)没有对应的参数,要么模板里存在不符合规范的%字符,导致解析逻辑出错。

排查步骤

1. 检查URL模板里的隐藏%字符

你提到同应用内同类请求大多正常,只有这两个异常,那大概率是这两个请求的URL模板(也就是EndPoints.MY_REQUEST_URL)里,除了你写的%s之外,还有其他的%字符——比如URL编码后的字符(像%20、%3D这类)。这些%会被String.format当成格式说明符的开头,比如%2会被认为是一个需要对应参数的格式符,但你只传了userid一个参数,自然就会触发崩溃。

你可以先在getData方法里加一行日志,打印原始的URL模板:

Log.d("URL Template Debug", EndPoints.MY_REQUEST_URL);

看看输出里是不是有除了%s之外的%字符,比如https://www.myweb.com/%2F/scripts/getData.php?userid=%s这种,里面的%2F就是问题根源。

2. 确认格式符与参数数量匹配

虽然你说写法和其他请求一致,但还是要检查下MY_REQUEST_URL里是不是不小心多写了一个%s,比如写成了userid=%s&other=%s,但你只传了userid一个参数,这也会触发这个异常。结合第一步的日志就能快速确认这一点。

解决方案

方案一:转义URL模板里的合法%字符

如果你的URL模板里确实需要保留URL编码的%(比如%20),那要把这些%转义成%%,这样String.format才会把它们当成普通字符处理。比如:

// 把原来的%20改成%%20
public static String MY_MAIN_URL = "https://www.myweb.com/%%20/";
public static String MY_REQUEST_URL = MY_MAIN_URL + "scripts/getData.php?userid=%s";

方案二:用Uri.Builder构建URL(更推荐)

相比String.format,用Android提供的Uri.Builder来拼接URL更安全,它会自动处理URL编码和特殊字符,从根源避免这类格式符问题。比如:

private void getData(String userid) {
    // 用Uri.Builder构建URL
    Uri url = Uri.parse(EndPoints.MY_MAIN_URL + "scripts/getData.php")
            .buildUpon()
            .appendQueryParameter("userid", userid)
            .build();
    String urlString = url.toString();
    Log.d("request url debug", urlString);
    
    // 后续的Volley请求代码不变
    StringRequest stringRequest = new StringRequest(Request.Method.GET, urlString, 
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 你的回调逻辑
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 错误处理逻辑
            }
        });
    
    stringRequest.setRetryPolicy(new DefaultRetryPolicy(
        10000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    VolleyRequestQue.getInstance(InsuitBusiness.getContext()).addToRequestQueue(stringRequest);
}

这种方式不仅能解决当前的崩溃问题,还能自动处理userid里可能包含的特殊字符(比如空格、&等),避免后续出现其他URL相关的问题。

内容的提问来源于stack exchange,提问作者Blerim Dauti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:33