Проблема с массивом класса, который я создал на Java

#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: это потому, что, как отмечалось в первых двух комментариях к этому ответу, ваша ошибка не связана с проблемой именования.