如何修复Java回文程序中的StringIndexOutOfBoundsException异常?
解决Java substring导致的StringIndexOutOfBoundsException问题
嘿,这个问题我太熟了!咱们先把错误根源揪出来,再一步步修复。
错误原因分析
你看到的StringIndexOutOfBoundsException是因为你调用substring的对象str2初始是空字符串""——它的长度是0,但你却试图从索引2开始截取子串,这显然超出了它的范围(空字符串连索引0都不存在),JVM肯定会报错。
而且你代码里的逻辑也有点混淆:你要处理的是sentence的回文,却错误地在空字符串str2上调用substring了。
修复方案
首先,把substring的调用对象改成sentence,然后搞清楚substring参数的规则:
Java的substring(int beginIndex, int endIndex)是左闭右开区间——包含beginIndex的字符,不包含endIndex的字符。如果要截取到字符串末尾,直接用substring(beginIndex)这个重载方法就好,不用写第二个参数。
比如修正你的循环代码:
// 假设sentence是你要处理的原始字符串 String str2 = ""; // 如果这个变量没用可以删掉,或者根据你的逻辑赋值 for(int k = 2; k < sentence.length(); k++) { // 从索引k开始截取到sentence末尾的子串 String str3 = sentence.substring(k); // 接下来添加你的回文判断逻辑,比如检查str3是否是回文 }
完整的回文检测示例
如果要实现子串的回文检测,这里给你一个完整的可运行示例:
public class PalindromeSubstringChecker { public static void main(String[] args) { String sentence = "abccba123321"; for(int k = 2; k < sentence.length(); k++) { String subStr = sentence.substring(k); if(isPalindrome(subStr)) { System.out.println("找到回文子串: " + subStr); } } } // 判断单个字符串是否为回文的工具方法 private static boolean isPalindrome(String str) { int left = 0; int right = str.length() - 1; while(left < right) { if(str.charAt(left) != str.charAt(right)) { return false; } left++; right--; } return true; } }
关键注意点
- 永远确保调用
substring的字符串不是空的,且beginIndex的范围是0 ≤ beginIndex < 字符串长度;如果用双参数版本,endIndex要满足beginIndex ≤ endIndex ≤ 字符串长度 - 别搞混变量!你要处理的是
sentence的内容,就别在空的str2上瞎操作啦 - 截取到末尾时用单参数
substring,代码更简洁不容易出错
内容的提问来源于stack exchange,提问作者Paul Mayrion
相关产品推荐
相关产品推荐

