Java:数组索引超出范围。循环问题

时间:2015-02-01 01:55:32

标签: java arrays

我对java很新,但我正在制作一个加密程序,将每个字符放在一个网格中。在这种情况下,我只会使用“abcde”作为我的字符串。当通过该程序时,它应该将每个字符放在3x2(高x宽)网格中。程序从上到下读取网格,然后移动到下一行,它将被读作“acebd”。程序的这一部分将每个字符加载到char [height] [width]。

line length: 5, height: 3, width: 2, longColumn: 1
//longColumn -- the number of valid columns in the last row


static char[][] loadGrid(String line, int width, int height, int longColumn) {
  char grid[][] = new char[height][width];


  int charCount = 0;
  for (int i = 0; i <= line.length()-1; i++){
     if (i < line.length()-1) {
        for (int c = 0; c < width; c++) {   
           for (int r = 0; r < height; r++) {
              if (r < height - 1 || c < longColumn) {
                 grid[r][c] = line.charAt(charCount);
                 charCount += 1;
              }
           }
        }
     } 
  }
return grid;  
}

当我运行它时,我收到此错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at GridEncrypt.loadGrid(GridEncrypt.java:93)
at GridEncrypt.processInput(GridEncrypt.java:65)
at GridEncrypt.main(GridEncrypt.java:19)

根据我的理解,charCount不会4,只是停留在3.我已经厌倦了它,但它只是停留在3或者转到5.此外,我认为它通过前两个for循环一次然后只是在它运行通过第三个循环后才回到它。然后第三个循环是唯一一个正确循环的循环。任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

我建议使用调试器,然后单步执行程序。确保跟踪数组大小和变量(尤其是r和c)。错误是由(r,c)在数组外部引起的。还有一些其他的事情。

1. charcount += 1;可以替换为charcount++; 2.请记住,在处理整数时,if (r < height - 1)if(r <= height - 2)基本相同 3.变量i和charcount正在说同样的事情,所以你可以组合这些变量。

答案 1 :(得分:0)

我没有看到longColumn的观点,我认为你想要像

这样的东西
static char[][] loadGrid(String line, int width, int height) {
    char grid[][] = new char[height][width];
    int charCount = 0;
    for (int r = 0; r < height; r++) {
        for (int c = 0; c < width; c++) {
            if (charCount < line.length()) {
                grid[r][c] = line.charAt(charCount);
                charCount++;
            }
        }
    }
    return grid;
}