我在Java中编写递归方法。它用于根据用户输入的一串数字生成前缀。这是一项家庭作业。我不是在问这个程序/方法。但是,我正在寻求帮助,指出导致我出现以下错误的原因:
线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0 at java.lang.String.charAt(String.java:646) 在Words.listCompletions(Words.java:81) 在Words.listCompletions(Words.java:86) 在Words.listCompletions(Words.java:86) 在Words。(Words.java:18) 在MindRead.main(MindRead.java:17)
有时当我在程序中遇到错误时,我无法看到导致错误发生的事情,即使它正好在我面前因为一段时间后我开始恐慌。任何帮助将不胜感激!我感谢您花时间查看我的方法。
这是我的递归方法:
public void listCompletions(String prefix,String digits){
if(digits.length()==0)
p.println(prefix);
String s=keypad(digits.charAt(0));
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
prefix=prefix+ch;
digits=digits.substring(1);
listCompletions(prefix,digits);
}
}//end of listCompletions
这是它在第4行调用的键盘功能:
public String keypad(char n){
String letters=null;
switch(n){
case '0':
letters="";
break;
case '1':
letters="";
break;
case '2':
letters="abc";
break;
case '3':
letters="def";
break;
case '4':
letters="ghi";
break;
case '5':
letters="jkl";
break;
case '6':
letters="mno";
break;
case '7':
letters="pqrs";
break;
case '8':
letters="tuv";
break;
case '9':
letters="wxyz";
break;
default:
System.err.println();
throw new IllegalArgumentException("\n\nERROR: "+n+" is "+
" not a valid entry.\n Valid entries are "+
"numbers 0 through 9.\n\n");
}//switch END
return letters;
}//end of keypad
答案 0 :(得分:2)
你的错误在那里:
if(digits.length()==0)
p.println(prefix);
String s=keypad(digits.charAt(0));
如果if或else中没有return语句来包装以下内容,即使使用空字符串也会执行最后一行,从而导致此异常。
答案 1 :(得分:0)
导致此异常的索引是索引0 - 字符串的第一个字符。所以你正在处理一个空的(&#34;&#34;)字符串
在递归方法中,您没有检查空字符串。在您的方法顶部/附近,您应该有一个基本情况,如
if (str == null || str.length == 0) {
... // handle null / empty string specially
}
答案 2 :(得分:-4)
当堆栈跟踪显示时,您调用charAt
传递一个无效的索引,在String开头之前(小于0)或超出String的结尾(大于或等于该数字)字符串中的字符)。在空字符串的这种特殊情况下,您的长度为0并尝试使用索引0,它大于或等于String的长度。因此例外。