Массив вне границ, когда я пытаюсь поменять местами значения - PullRequest
0 голосов
/ 17 апреля 2011

Я пытаюсь поменять значения в двумерном массиве, но получаю ошибку времени выполнения «вне границ».

Что не так?

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //Q1
        int row = 3;
        int colum = 5;

        //Declare 2d array
        int [][] matrix = new int [row][colum];
        //Create array and input values
        Scanner input = new Scanner(System.in);
        System.out.println("Enter " + matrix.length + " rows and "
        + matrix[0].length + " colums: \n");
        for (row = 0; row < matrix.length; row++) {
            for (colum = 0; colum < matrix[row].length ; colum++) {
                matrix[row][colum] = input.nextInt();
        }
            }
        System.out.println("\nMultiplication table");
        System.out.println("--------------------");

        //Print the array
        for (row = 0; row < matrix.length; row++ ) {
            for (colum = 0; colum < matrix[row].length; colum++ ) {
                System.out.printf("%4d", matrix[row][colum]);
            }

            System.out.println();
        }
        //Q2 - Make the values swapable
        Scanner input1 = new Scanner(System.in);
        System.out.println("\n1: Modify a value. ");
        System.out.println("0: Exit the application");
        int selection = input1.nextInt();
        switch(selection) {
            case 0:
                System.exit(0);
                break;
            case 1:
                System.out.println("\nPlease enter the row you would like to change: "  );
                Scanner input2 = new Scanner(System.in);
                int changeRow = input2.nextInt();
                System.out.println("You entered: " + changeRow);
                System.out.println("Please enter the colum you would like to change: "  );
                Scanner input3 = new Scanner(System.in);
                int changeColum = input3.nextInt();
                System.out.println("You entered: " + changeColum);

    error--->   int temp = matrix[row][colum];
                matrix[row][colum] = matrix[changeRow][changeColum];
                matrix[changeRow][changeColum] = temp;

                System.out.println("The value in row " + changeRow + "and colum " + changeColum + "is now changed to " + temp);




                break;

            }
        }
    }

Ответы [ 3 ]

1 голос
/ 17 апреля 2011

Было бы легче обнаружить это, если бы вы опубликовали трассировку стека вашего исключения. Вот мое предположение:

 int temp = matrix[row][colum];

Какие здесь значения row и column? Они последний раз использовались ранее в цикле для печати массива, поэтому теперь у вас есть row == matrix.length и column == matrix[row].length (со значением row, равным одному).

Конечно, это за пределами допустимых границ массива, и вы получаете исключение IndexOutOfBoundsException.

1 голос
/ 17 апреля 2011

Вы используете row и column в своих циклах. Проверьте их значение ПОСЛЕ петель. Я не уверен, что увеличение сделано, а затем проверка < не проходит, но если это произойдет, то это

int temp = matrix[row][colum];

пытается найти

matrix[3][5];

и, начиная с 0, его не существует.

0 голосов
/ 17 апреля 2011

Когда вы получаете входы changeRow, changeColum, вам нужно создать еще один массив, инициализированный с длинами, а затем присвоить значения путем сравнения предыдущих длин массивов.

...