Java回文判断代码触发java.lang.StringIndexOutOfBoundsException异常的问题排查
回文判断代码的索引越界异常排查与修复
嘿,我来帮你搞定这个问题!你遇到的java.lang.StringIndexOutOfBoundsException是典型的字符串索引使用错误,另外代码里还有个隐藏的小问题,我一步步给你拆解:
异常根源
首先得记住:Java里字符串的索引是从0开始计数的。
- 你的字符串
"aabbaa"长度是6,所以合法的索引范围是0到5(对应第1到第6个字符) - 但你在
main方法里调用palindrome(str, 0, n)时,n是str.length()返回的6,当方法执行str.charAt(end)时,end=6就超出了合法索引的上限,直接触发了越界异常
另外还有个容易忽略的问题:palindrome是实例方法(非静态),但你在静态的main方法里直接调用它,这其实是编译错误,只是索引异常先触发了而已。
修复方案
针对这两个问题,给你两种可行的修改方式:
方式一:把判断方法改为静态,修正end参数
这种方式最简单,适合工具类风格的写法:
public class Main { // 改为静态方法,让静态的main可以直接调用 static boolean palindrome(String str, int start, int end){ if(start >= end) return true; return(str.charAt(start) == str.charAt(end)) && palindrome(str, start+1, end-1); } public static void main(String[] args) { String str = "aabbaa"; int n = str.length(); // 把end参数改成n-1,对应最后一个字符的合法索引 System.out.println(palindrome(str, 0, n-1)); } }
方式二:创建类实例调用方法,修正end参数
如果你想保持方法的实例属性,就用这种方式:
public class Main { boolean palindrome(String str, int start, int end){ if(start >= end) return true; return(str.charAt(start) == str.charAt(end)) && palindrome(str, start+1, end-1); } public static void main(String[] args) { String str = "aabbaa"; int n = str.length(); // 创建Main类的实例 Main palindromeChecker = new Main(); // 传入合法的end索引n-1 System.out.println(palindromeChecker.palindrome(str, 0, n-1)); } }
测试结果
修改后运行代码,控制台会输出true,完美验证"aabbaa"是回文字符串,同时再也不会抛出索引越界的异常啦!
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

