2015-02-01 2 views
-1

Я довольно новичок в java, но я делаю программу шифрования, которая помещает каждый символ в сетку. В этом случае я просто использую «abcde» в качестве моей строки. При переносе через программу предполагается разместить каждый символ в сетке 3x2 (высота x ширина). Программа считывает сетку сверху вниз, а затем переходит к следующей строке, и она будет считана как «acebd». Эта часть программы загружает каждый символ в char [height] [width].Java: индекс массива за пределами границ. Проблемы с петлей

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. Кроме того, я думаю, что он проходит через первые два цикла, а затем просто не возвращается к нему после прохождения третьего цикла. Который тогда 3-й цикл является единственным, который правильно зацикливается. Любая помощь приветствуется. Благодарю.

+0

Что такое высота и какова ширина? Почему вы не используете 'grid.length'? –

+0

Высота r, которая равна 3. Ширина - c, а это 2. Grid еще ничего, просто пустой массив. В принципе, line.length - это количество раз, когда я хочу, чтобы оно было зациклировано, в зависимости от количества символов в строке. @ElliottFrisch – yuya

ответ

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; 
} 
0

Я бы рекомендовал использовать отладчик и пройти через программу. Обязательно отслеживайте размеры и переменные массива (особенно r и c). Ошибка вызвана тем, что (r, c) находится вне массива. Кроме того, несколько других вещей.

1. charcount += 1; можно заменить charcount++; 2. Помните, что при работе с целыми числами, if (r < height - 1), по существу, такой же, как if(r <= height - 2) 3. Переменные я и CharCount говорят то же самое в любом случае, так что вы можете комбинировать эти переменные ,