0

私はオブジェクトの配列を持っているので、本質的にはオブジェクト参照の配列です。私が参照しているクラスの中には、別の参照があります。このデータ構造を初期化する必要がありますが、初期化中にクラッシュします。参照クラス内で参照を初期化しようとしていますが、常にnullのままなので、まだ理解していないJavaの「もの」がいくつかあります。これはとても単純なようですが、とてもイライラします。問題の簡単な例を次に示します。

public class ref1
{
    public int myInt;
}
public class ref2
{
    public ref1 myRef;
}
public ref2 buffer[];
int i;

// Code to initialize the above data structures:
buffer = new ref2[255];
for (i=0; i<255; i++)
{
    buffer[i] = new ref2();
    buffer[i].myRef = new ref1();   // (1) ALWAYS returns null????
}

最終的に、上記のコードは、(1)マーカーがある行で「ArrayOutOfBoundsException」を使用してクラッシュします。デバッガーで2番目に気付くのは、myRefが常にnullに設定されていることです。ref1オブジェクトを作成して参照できないのはなぜですか?????

(1)でマークされた行をコメントアウトすると、例外トラップがないため、問題が発生します。

これを完全な初心者に説明できる人に感謝します...

4

3 に答える 3

1
salam package cruft;

/**
 * BadRef description here
 * @author Michael
 * @link
 * @since 6/25/12 5:53 PM
 */
public class BadRef {

    public static void main(String[] args) {
        ref2 buffer[] =  new ref2[255];
        for (int i = 0; i < 255; ++i) {
            buffer[i] = new ref2();
于 2017-01-29T04:30:08.583 に答える
0

これは私にとってはうまくいきます。私はあなたが何をしているのか分かりません:

package cruft;

/**
 * BadRef description here
 * @author Michael
 * @link
 * @since 6/25/12 5:53 PM
 */
public class BadRef {

    public static void main(String[] args) {
        ref2 buffer[] =  new ref2[255];
        for (int i = 0; i < 255; ++i) {
            buffer[i] = new ref2();
            buffer[i].myRef = new ref1();
            buffer[i].myRef.myInt = i;
            System.out.println(buffer[i]);
        }
    }
}


class ref1 {
    public int myInt;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("ref1");
        sb.append("{myInt=").append(myInt);
        sb.append('}');
        return sb.toString();
    }
}

class ref2 {
    public ref1 myRef;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("ref2");
        sb.append("{myRef=").append(myRef);
        sb.append('}');
        return sb.toString();
    }
}
于 2012-06-25T21:55:37.050 に答える
0

各反復でbuffer[i].myRefの値を検査している場合、それは毎回実際にはnullになります。これは正しいです。なぜなら、各反復で、buffer[i]はnullのmyRefフィールドを持つ新しいref2インスタンスであるためです。ref2インスタンスは、配列の前の位置に格納されます。

したがって、デバッガーでbuffer []配列値を展開すると、現在のオブジェクトの下の位置に以前に作成されたオブジェクトが表示されます。

ArrayOutOfBoundsExceptionについては...実際にArrayIndexOutOfBoundsExceptionを参照していると想定しています(そうでない場合は修正してください)。この場合、境界は正しく設定されています。255位置の配列を作成していて、それを0から254(i <255の部分)まで正しく反復しています。したがって、これは正常に機能します。コードを再確認してください。

于 2012-06-25T21:58:46.593 に答える