我有以下代码,它使用此类对象数组中的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}}为空的原因。我是否在数组中声明了错误的内容?
谢谢。
答案 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]
;