从数组中分配插入 - Java

时间:2011-12-03 19:32:15

标签: java arrays jtextarea insets

我有以下代码,它使用此类对象数组中的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]分配为JTextAreas,我找不到{{1}}为空的原因。我是否在数组中声明了错误的内容?

谢谢。

3 个答案:

答案 0 :(得分:3)

您已初始化了一个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(整数))将直接给出值。

但是,对象的情况有点不同。当我做的时候

Object[] objArray = new Object[10];

这将在内存中再次创建连续的10个引用。假设引用是2个字节,它将连续需要20个字节。而所有这些只是指向没有位置的引用,即它们为空。我们有责任明确地援引它们。

答案 1 :(得分:0)

你对这一行所做的一切:

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

初始化数组。你没有初始化任何数组成员(它们都是null)。您需要迭代数组并在每个插槽中放置一个对象,然后才能使用它。

答案 2 :(得分:0)

此行JTextField[] Input = new JTextField[10]分配数组。但是这个数组的每个元素都是null。因此,尝试转向元素并调用其方法抛出

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

现在您可以访问input[0];