2

JTextAreasこのようなオブジェクトの配列からの の1 つを使用して、プログラム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();  //?

         ...
      }
}

私が持っている場所は、この行で発生した//?ことを示す例外を取得する場所です。alll を に割り当てた場合に null になるjava.lang.NullPointerException理由が見つかりません。配列で何かを間違って宣言していますか?Input[0]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 バイトが必要になります。そして、これらはすべて、どこも指していない、つまり null である単なる参照です。それらを明示的に呼び出すのは私たちの義務です。

于 2011-12-03T19:35:21.637 に答える
0

この行で行ったすべて:

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

配列を初期化します。どの配列メンバーも初期化していません (それらはすべてまだ null です)。配列を反復処理し、使用する前に各スロットにオブジェクトを配置する必要があります。

于 2011-12-03T19:36:13.600 に答える
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]ました。

于 2011-12-03T19:37:50.880 に答える