“主要” java.lang.ArrayIndexOutOfBoundsException

时间:2018-07-03 13:05:35

标签: java recursion

使用电话键盘给定整数n,使用输入n的数字找出所有可能的字符串。 返回数字0和1的空字符串。

输入

23

输出

ad
ae
af
bd
be
bf
cd
ce
cf

代码:

public class returnKeypad {
    private static String[] correspondingkepad(int n) {
        String keyWords[];

        switch (n) {
            case 2:  
                keyWords = new String[]{"a","b","c"};
                break;
            case 3:  
                keyWords = new String[]{"d","e","f"};
                break;
            case 4: 
                keyWords = new String[]{"g","h","i"};
                break;
            case 5:  
                keyWords = new String[]{"j","k","l"};
                break;
            case 6:
                keyWords = new String[]{"m","n","o"};
                break;
            case 7: 
                keyWords = new String[]{"p","q","r","s"};
                break;
            case 8: 
                keyWords = new String[]{"t","u","v"};
                break;
            case 9:  
                keyWords = new String[]{"w","x","y","z"};
                break;
           default:  
               keyWords = new String[]{""}; 
        }

        return keyWords;
    }

    public static String[] keypad(int n){
        if (n == 0) {
            String[] ans = {""};
            return ans;
        }

        String[] smallAns = keypad( n / 10 );      //line 45

        String[] p = correspondingkepad(n % 10);

        String[] ans = new String[p.length * smallAns.length];

        int k = 0;

        for(int i = 0; i < ans.length; i++) {
            for(int j = 0; j < p.length; j++) {
                ans[k] =  smallAns[i] + p[j];  //line 55             
                k++;
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        String s = "xyz";
        String[] ans = keypad(234); //line 66

        for(int i = 0; i < ans.length; i++) {
            System.out.println(ans[i]);
        }
    }
}

例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at returnKeypad.keypad(returnKeypad.java:55)
    at returnKeypad.keypad(returnKeypad.java:45)
    at returnKeypad.keypad(returnKeypad.java:45)
    at returnKeypad.main(returnKeypad.java:66

我在评论中提到行号

请告诉我该问题的解决方法是否错误,或者我的代码有什么问题 谢谢

2 个答案:

答案 0 :(得分:2)

您以ans而不是smallAns的大小对“ i”进行迭代

更改:

for(int i = 0; i<ans.length; i++) {
         for(int j =0; j<p.length; j++) {
             ans[k] =  smallAns[i] + p[j];  //Line55             
             k++;
         }
     }

收件人:

for(int i = 0; i<smallAns.length; i++) {
         for(int j =0; j<p.length; j++) {
             ans[k] =  smallAns[i] + p[j];  //Line55             
             k++;
         }
 }

这将解决越界错误,我不确定其余逻辑是否有意义...

答案 1 :(得分:1)

您的smallAns[i]除了""之外没有其他任何值,因此当我增加到1时,java.lang.ArrayIndexOutOfBoundsException就失败了。请在keypad(int n)中完善您的逻辑;由于您使用的是递归调用,因此返回时,它只会在最后一次迭代中出现。