远程服务字符串解析异常求助:含Body:的字符串未进入正确分支
问题修复方案
这问题我碰到过好几次,大概率是indexOf的特性或者字符串里存在你没注意到的细节导致的,咱们一步步来排查和修复:
可能的触发原因
你的代码里用longString.indexOf("Body:") != -1判断是否包含目标子串,但没匹配到,常见原因有这几个:
- 大小写不匹配:远程返回的字符串可能是小写
body:、大写BODY:或者混合大小写,而indexOf是严格大小写敏感的,自然匹配不到。 - 隐藏空白/特殊符号:比如
Body:前面有空格、制表符(\t),或者冒号是全角的:(而非半角:),肉眼很难分辨。 - 转义字符干扰:如果远程返回的字符串里
Body:中的冒号被转义成了Body\:,直接查找Body:当然会失败。
针对性修复方案
1. 解决大小写问题
最直接的办法是把字符串统一转成小写(或大写)后再判断,彻底避免大小写差异的影响:
String longString = service.getString(); if (longString.toLowerCase().indexOf("body:") != -1) { // 原来的some code逻辑 } else { // 原来的other code逻辑 }
2. 处理空白/特殊符号问题
如果是空白字符或全角冒号的问题,可以用正则表达式来做更灵活的匹配,允许Body:前后有任意空白,同时忽略大小写:
String longString = service.getString(); // (?i) 表示忽略大小写,\\s* 匹配任意数量的空白字符 if (longString.matches("(?i).*\\s*Body:\\s*.*")) { // some code } else { // other code }
如果确定是全角冒号的问题,也可以直接同时匹配半角和全角冒号:
if (longString.indexOf("Body:") != -1 || longString.indexOf("Body:") != -1) { // some code } else { // other code }
3. 先调试确认字符串真实内容
最稳妥的方式是先把远程返回的字符串完整打印出来,排查是否有隐藏字符:
String longString = service.getString(); // 打印原始字符串,包括转义字符 System.out.println("远程返回的原始字符串:" + longString); // 逐个打印字符的ASCII码,排查隐藏字符 for (char c : longString.toCharArray()) { System.out.print((int) c + " "); }
比如半角冒号的ASCII码是58,全角是65306,空格是32,通过这个方法你能准确看到字符串里的每一个字符,针对性修复就简单多了。
内容的提问来源于stack exchange,提问作者Denis Vabishchevich
相关产品推荐
相关产品推荐

