递归方法给我一个错误Java

时间:2014-11-24 16:55:26

标签: java recursion

我在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

3 个答案:

答案 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的长度。因此例外。