Как работает этот код Java? - PullRequest
       6

Как работает этот код Java?

3 голосов
/ 26 апреля 2010
public static void main(String[] args)
{
    int [][]shatner = new int[1][1];
    int []rat = new int[4];
    shatner[0] = rat;
    System.out.println(shatner[0][3]);
}    

удивлен, на выходе 0, почему Java не проверяет такого рода ошибку indexOutOfBound?

Ответы [ 7 ]

6 голосов
/ 26 апреля 2010

Не удивляйся. shatner [0] - это массив (крыса), длина которого равна 4. Так что shartner [0] [3] - это крыса [3], которая равна 0 ..

5 голосов
/ 26 апреля 2010

Где вы видите «ошибку indexOutOfBound»? Код делает следующее:

  • Инициализировать массив (размер 1) из int массивов (размер 1), т. Е. Двумерный массив, содержимое инициализируется с 0
  • Инициализировать массив int, размер 4, содержимое инициализируется с 0
  • установить один элемент 2D-массива на размер 4 1D-массив
  • доступ к последнему элементу первого массива в 2D-массиве, который равен 0
4 голосов
/ 26 апреля 2010

Ничто не выходит за пределы.

0-я строка в массиве shatner переинициализируется до int[4].

3 голосов
/ 26 апреля 2010

Это не значит, что Java не проверяет исключение IndexOutOfBoundsException. Дело в том, что ответ ДОЛЖЕН быть нулевым. Ключевая строка -

shatner[0] = rat;

Поскольку это означает, что 0-й индекс shatner указывает на массив длиной 4, shatner[0][4] полностью допустим.

3 голосов
/ 26 апреля 2010

Нет ошибки индекса вне границ. Шатнер - это массив массивов. Вы заменили первый массив длины один новым длиной четыре. Так что теперь shatner [0] [3] - совершенно законное место в памяти.

0 голосов
/ 26 апреля 2010

Массивы не обязательно должны быть прямоугольными в Java. Это зазубренный массив и он отлично подойдет.

0 голосов
/ 26 апреля 2010

Я думаю, это потому, что массивы Java работают немного иначе, чем ожидалось. Вы инициализируете shatner в [1] [1], что означает что-то вроде {{0},{0}} в памяти.

Однако затем вы назначаете целое число первому элементу, превращая его в {{0,0,0,0},{0}} в памяти, поэтому Java обращается к вновь назначенному индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...