Назначение вставок из массива - Java - PullRequest
2 голосов
/ 03 декабря 2011

У меня есть следующий код, который использует один из JTextAreas из массива таких объектов, чтобы назначить Insets из JTextArea для моей программы.Код выглядит следующим образом:

import javax.swing.*;
import java.awt.*; 

public class MainComponents
{ 
     private final static JTextField[] Input = new JTextField[10];

     public MainComponents(final Container P, final JFrame frame)
     { 

         P.setLayout(null);
         final Insets insets = P.getInsets();
         final Dimension InputInsets = Input[0].getPreferredSize();  //?

         ...
      }
}

Где у меня есть //?, где я получаю исключение, которое говорит мне, что java.lang.NullPointerException происходит в этой строке.Я не могу найти причину, по которой Input[0] будет нулевым, если я назначу им alll равным JTextAreas.Я неправильно объявляю что-то в массиве?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 03 декабря 2011

Вы инициализировали массив JTextField. Но каждый элемент в массиве все еще не инициализирован.

private final static JTextField[] Input = new JTextField[10];

Input[0] = new JTextField(); //And then perform operation on 0th element

Чтобы пролить больше света на это,

Всякий раз, когда вы инициализируете какой-либо примитивный массив в Java, он будет выделять память непрерывно на основе переданного типа данных.

Например,

int[] intArray = new int[10]; // Assuming int is 4 bytes, 40 bytes allocated continuously
double[] doubleArray = new double[10]; // Assuming double is 8 bytes, 80 bytes allocated continuously.

И обратите внимание, что intArray или doubleArray - это ссылка, которая будет указывать на начальную ячейку памяти выделенного значения. По этой причине при поиске по индексу массивы работают быстрее. когда вы делаете intArray [5], все, что он делает, это идет к начальному адресу intArray + (5 * sizeof (integer)), чтобы получить значение напрямую.

Однако в случае с объектами дела обстоят немного иначе. Когда я

Object[] objArray = new Object[10];

Это снова создаст 10 непрерывных ссылок в памяти. Предполагая, что ссылка составляет 2 байта, ей потребуется 20 байтов непрерывно. И все это просто ссылки, которые указывают ни на что, то есть они являются нулевыми. Наш долг - вызывать их явно.

0 голосов
/ 03 декабря 2011

Эта строка JTextField[] Input = new JTextField[10] выделяет массив. Но каждый элемент этого массива является нулевым. Итак, попытка обратиться к элементу и вызвать его методы throws

NullPointerExcetption. You have to initialize the array, e.g. 
for (int i = 0;  i < input.length;  i++) {
    input[i] = new JTextArea();
}

теперь вы можете получить доступ к input[0];

0 голосов
/ 03 декабря 2011

все, что вы сделали с этой строкой:

 private final static JTextField[] Input = new JTextField[10];

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

...