2

我有以下代码,它使用JTextAreas此类对象数组中的一个来为我的程序分配Insetsa 。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]null的原因JTextAreas。我是否在数组中错误地声明了某些内容?

谢谢你。

4

3 回答 3

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(integer)) 将直接给出值。

但是,在对象的情况下,情况有些不同。当我做

Object[] objArray = new Object[10];

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

于 2011-12-03T19:35:21.637 回答
0

你对这一行所做的一切:

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

是初始化数组。您没有初始化任何数组成员(它们仍然为空)。您需要遍历数组并在每个插槽中放置一个对象,然后才能使用它。

于 2011-12-03T19:36:13.600 回答
0

此行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]

于 2011-12-03T19:37:50.880 回答