#java #arrays #class
#java #массивы #класс
Вопрос:
Я хочу создать массив типа, который я создаю. Вот моя проблема:
public class MyFile
{
int page_no=23;
Page[] pages_in_file;
MyFile()
{
pages_in_file=new Page[page_no];
}
}
И Java выдает ошибку, когда debug переходит к части Page[], и это даже не включает конструктор страницы.
Класс страницы — это:
public class Page
{
String data=null;
String contain=null;
Page()
{
data = new String();
contain = new String();
}
}
Сообщение об ошибке: «Источник не найден» и выдает это исключение NullPointerException, когда я пытаюсь получить доступ к элементу в массиве.
Думаю, я не вижу очевидной ошибки, но я ценю любую помощь. Спасибо
Комментарии:
1. Каков фактический полный текст сообщения об ошибке и где вы объявляете и инициализируете переменную page_no? Правка 1: Теперь я вижу, где вы объявляете переменную page_no.
2. Почему вы не говорите нам, какую ошибку вы получаете?
Ответ №1:
Java выделяет память только для ваших классов, она не запускает конструкторы при инициализации массива. Как минимум, вам нужно будет добавить:
for (int i = 0; i < pages_in_file.length; i )
pages_in_file[i] = new Page();
Комментарии:
1. На самом деле, Java выделяет память только для массива ссылок. Все эти ссылки имеют значение
null
. Чтобы выделить сам объект и вызвать его конструктор,new
должен использоваться.2. @Etinne — Это именно то, что я только что сказал. Почему люди чувствуют необходимость «исправить» утверждение, которое и так является правильным, говоря точно то же самое с немного другой формулировкой? facepalm
3. Таким образом, это приводит к исключению NullPointerException.
4. Хорошо, я решил. Я отредактировал ваш ответ, и это работает идеально. Большое спасибо!
5. Джо: Это не совсем то, что вы только что сказали. Java выделяет память только для объектов во время запуска конструктора. При инициализации массива он выделяет память только для массива, а не для ваших объектов (слово классы здесь не имеет смысла). Люди чувствуют необходимость исправить неверное утверждение, говоря похожие вещи с другой, но правильной формулировкой.
Ответ №2:
Построение массива объектов не подразумевает построение самих объектов. Следовательно, ваша ошибка заключается (скорее всего) в том, что page_no
значение отрицательное или иным образом не задано. К сожалению, ваш демонстрационный код не включает в себя page_no
определение и значение.
Комментарии:
1. Я отредактировал код и случайно удалил эту строку. page_no равно 23.
Ответ №3:
Это из-за класса File. В Java уже есть класс с именем File, и это конечный класс, поэтому вам нужно переименовать ваш файловый класс во что-то другое.
Комментарии:
1. Нет, имена классов не обязательно должны быть уникальными в пространствах имен в Java. В конце концов, какова была бы цель пространств имен, если бы их не было?
2. Нет.
File
находится вjava.io
упаковке. Это не будет противоречить этому.3. Хотя вам, вероятно, следует переименовать этот класс, поскольку его название, как правило, сбивает с толку многих из нас.
4. @cantbereached: это потому, что, как отмечалось в первых двух комментариях к этому ответу, ваша ошибка не связана с проблемой именования.