Java Q&A



Массивы массивов - часть 2


sa[0] = "Hello, World"; sa[1] = "Guten Tag, Welt"; // теперь sa указывает на массив из двух непустых ссылок типа String.

sa = new String[1]; // sa.length equals 1 // Та же ссылка sa тперь указывает на другой // (и более короткий) массив. // sa[0] это null ссылка типа String. // Попытка обратится к sa[1] вызовет // ArrayIndexOutOfBoundsException.

sa[0] = "Hello, World"; // sa[0] теперь непуста.

Вам также необходимо учитывать, что

String [] [] saa; saa [0] [0] = "Help";

приведет к NullPointerException, так как saa это пустая ссылка -- saa не ссылается ни на один объект. Для того, чтобы присвоить значение первому элементу первого массива saa должна ссылаться на массив с ненулевой длиной и saa[0] должна ссылаться на непустой массив строк также с ненулевой длиной. Теперь мы можем написать:

String [] [] saa; // saa это null ссылка на массив массивов, содержащих String // Попытка вызвать saa.length сразу же приведет к NullPointerException, // так же как и вызов saa[0].

saa = new String [1][]; // saa теперь ссылается на массив, содержащий 1 null ссылку на String[]. // saa.length равна 1. // saa[0] пуст.

saa[0] = new String[2]; // saa теперь ссылается на массив, содержащий одну непустую ссылку // на String[] с длиной 2. // saa.length по-прежнему равна 1. // saa[0].length равна 2 (но saa[0][0] и // saa[0][1] обе null).

saa[0][0] = "Hello, World"; saa[0][1] = "Guten Tag, Welt"; // Теперь saa[0][0] и saa[0][1] обе непусты.

Заметье, что вы не можете ссылаться на saa[0][0] пока saa[0] непуст, и вы не можете сделать saa[0] непустым пока вы не сделаете saa непустым также. В принципе вам прийдется создавать сво массив массивов в возрастающем порядке.

Вот упрощенный способ для инициализации ссылок в массивах:

String [][] saa = { { { "Hello, World }, { "Guten Tag, Welt"} } }; // создаем объект String[][], как и ранее // и присваиваем ему saa. // Пробел подчеркивает, что созданный объект // это массив из одного String[], // содержащий две строки.

Используя такой прием, перепишем наш пример:

String [][] saa = { { { "Help" } } };

Однако saa теперь указывает на последовательный массив строк. Заметьте, что приведенный синтаксис работает только при инициализации ссылки на массив (инициализация это специальный тип присваивания во время объявления). Более общий способ создания нового массива и присваивания ему ссылки на новый или существующий массив выглядит так (в этом случае для уже существующей ссылки):

saa = new String [][] { // заметьте пустые [][] -- компилятор сам // установит размер (пустые [][] должны быть обязательно). { { "Hello" }, { "World" } } // это saa[0] , // заметьте запятую, разделяющую // saa[0] и saa[1] { { "Guten Tag" }, { "Welt"} } // это is saa[1] }; // теперь saa.length = 2, и длина saa[0] и saa[1] также 2




Содержание  Назад