0

これが機能しない理由がよくわかりません。コンパイルして実行しようとすると、ヌルポインター例外が発生します。私はそれが非常に単純で、おそらくばかげた質問であることを知っていますが、私はそれを理解できないようです!

import javax.swing.JOptionPane;

public class Whatever
{

    private int age; 
    private String name;
    private float salary;

    public Whatever ()
    {
        String userName = JOptionPane.showInputDialog ("What is your name?");
        Whatever listData[] = new Whatever [10];
        listData[6].name = userName; 
    }

    public static void main (String [] args)
    {
        Whatever testWhatever = new Whatever ();
    }
}
4

2 に答える 2

5

インスタンスの配列Whatever- すべてがnull.

new を呼び出して配列要素を初期化すると、独自の配列を構築して new を呼び出すなど、OOM エラーが発生するまで、OutOfMemoryErrorそれを修正するとすぐに別の問題が発生すると思います。Whatever

次のエラーに進むことができるように、スペルアウトします。

import javax.swing.JOptionPane;

public class Whatever
{
    private int age; 
    private String name;
    private float salary;

    public Whatever () {
        String userName = JOptionPane.showInputDialog ("What is your name?");
        Whatever listData[] = new Whatever[10];
        for (int i = 0; i < listData.length; ++i) {
            listData[i] = new Whatever();  // This is where you'll get the OOM error.  See why?
        }
        // You'll never get here.
        listData[6].name = userName; 
    }

    public static void main (String [] args)
    {
        Whatever testWhatever = new Whatever();
    }
}

そして、Swing コードをコンストラクターに入れていますか? これは悪いコードの書き方の例として意図したものですか?

今後の参考のために、市場で最高の IntelliJ などの優れた IDE でコードを実行し、デバッグをオンにしてコードをステップスルーする必要があります。SOで尋ねるよりも早く、問題がどこにあるのかをすぐに理解できます。

そうです、それはかなりばかげた例です。うまくいけば、あなたは実際にこのようなことを書いていません。

于 2013-06-03T20:20:03.093 に答える
1

これとともに

Whatever listData[] = new Whatever [10];

新しい配列を初期化しましたが、配列内の要素は初期化されていません。

したがって、アクセスすると NullPointerException が発生しますlistData[6].name

これを試すことができます:

for(int i = 0; i < listData.length; i++) {
    listData[i] = new Whatever(); 
}

、ただし、コンストラクター自体ではなく、これを行ってください。ダフィーモが言ったように、 OutOfMemoryException が発生するからです。

たとえば、これをメインで直接実行してみてください。

于 2013-06-03T20:42:45.270 に答える