-1

単純な「電話帳」アプリを作成しようとしていますが、何か問題があります。しかし、何をidk。

これは私のファーストクラスです、

    import java.util.Scanner;
    public class PhoneBookEntryDemo
    {
    public static void main(String[] args){
        int k=0,contacts=0;
        String position;
        Scanner KB = new Scanner(System.in);

        System.out.println("This is a automatic phonebook. the first of its kind.");
        System.out.println("How many contacts do you want to enter today?"); 
        contacts = KB.nextInt();
        PhoneBookEntry[] Test = new PhoneBookEntry[contacts];
        do{
                switch (k) {     //this is for formatting the out put
                case 0: position="st";
                        break;
                case 1: position="nd";
                        break;
                case 2: position="rd";
                        break;
                default: position="th";
                        break;
            }
            System.out.println("Please enter the name "+ (k+1)+position+" of the contact: ");
            Test[k].getName(KB.next()); //sets the name of what ever the counter is @
            System.out.println("Now enter the phone number: ");
            Test[k].getPhoneNumber(KB.nextInt()); //sets the phone number at whatever the counter is @
            k++;
        }while(k<contacts);
        }
    }

これは私の2番目のクラスです、

    public class PhoneBookEntry
    {
        String name;
        int phoneNumber;
        public PhoneBookEntry(String aName, int aPhoneNumber){
            name = aName;
            phoneNumber = aPhoneNumber;
        }
        public void getName(String setName){
            name = setName;
        }
        public void getPhoneNumber(int setPhoneNumber){
            phoneNumber = setPhoneNumber;
        }

    }

準拠していますが、実行時エラーがスローされます。

java.lang.NullPointerException at PhoneBookEntryDemo.main(PhoneBookEntryDemo.java:31)

私は自分のメソッド呼び出しを知っていますが、何が間違っているのか理解できません。いくつかの異なる反復を試しましたが、それでもサイコロはありません。

4

2 に答える 2

2
PhoneBookEntry[] Test = new PhoneBookEntry[contacts];

contactsこれにより、すべての要素がに初期化されるサイズの配列が作成されnullます。

内部の要素(例Test[0])にアクセスしようとすると、が取得されnullます。nullでメソッドを呼び出すことはできません(で行っているようにgetName(..))。

配列を繰り返し処理し、すべての要素を初期化する必要があります。

for (int i = 0; i < Test.length; ++i)
  Test[i] = new PhoneBookEntry(name, phoneNumber);

また

for (int i = 0; i < Test.length; ++i)
{
  Test[i] = new PhoneBookEntry();
  Test[i].setName(name);
  Test[i].setPhoneNumber(phoneNumber);
}

好奇心から:なぜあなたのセッターはゲッターとして名付けられているのですか?

于 2012-04-19T04:27:56.793 に答える
0

問題は非常に単純です。

PhoneBookEntry[] Test = new PhoneBookEntry[contacts];

これは PhoneBookEntryタイプの配列です...- they're just compiler syntactic sugar for specific classes. The JVM has no knowledge of them. That means the default value for the type is null.
その後、uはこれを呼び出します:-

Test[k].getName(KB.next()); //sets the name of what ever the counter is @

オブジェクトがそのオブジェクトのnullいずれかのメソッドを呼び出す場合よりも大きい場合、uは明らかに次のようになります。java.lang.NullPointerException

では、この問題をどのように取り除くか-:

u名前電話番号の両方を取得してから、これらのオブジェクトを作成するPhoneBookEntry class 必要があります。クラスにはdefault constructor このようなものはありません。

        System.out.println("Please enter the name "+ (k+1)+position+" of the contact: ");
        String name=KB.next(); //sets the name of what ever the counter is @
        System.out.println("Now enter the phone number: ");
        Int phone=Integer.parseInt(KB.next());; //coz your class take int
        // now create your object
        Test[k]=new PhoneBookEntry(name,phone)
于 2012-04-19T05:11:50.570 に答える