0

私は以前、このサイトを使用して多くのプログラミング課題を支援してきましたが、現在抱えている問題に似たものを見つけることができません。

myHobbiesメソッド を使用して person クラスの toString の配列を最初に出力printHobbyし、ユーザーが で趣味を行っている合計時間を計算しようとしていますprintDuration。なぜそれを機能させることができず、しばらく苦労しているのかわかりません。

どんな助けでも大歓迎です。これが私のクラスです。初めての投稿なので間違っていたら教えてください。

//--------------------Person--------------------
public class Person {
    String fName;
    String lName;
    String address;
    int age;

    String hobbyText;
    private double durationH = 0;
    private double totalDuration = 0;

    Person(String f, String l, String a, int ag) {
        fName = f;
        lName = l;
        address = a;
        age = ag;
    }

    static Hobby[] myHobbies = new Hobby[5];

    static int i = 0;

    public static void setHobby(Hobby mh) {
        myHobbies[i] = mh;
        i++;
    }

    public String toString() {
        return fName + " " + lName + " " + address + " " + age + " "
                + printDuration() + " ";
    }

    public double printDuration() {
        for (int k = 0; k < myHobbies.length; k++)
            totalDuration += myHobbies[k].getDuration();
        return totalDuration;
    }

    public String printHobbies() {
        for (int j = 0; j < myHobbies.length; j++)
            hobbyText = myHobbies[j].toString();
        return hobbyText;
    }

}


//--------------------HobbyDriver--------------------
import java.util.Scanner;

public class HobbyDriver {

    public static void main(String[] args) {

        Hobby[] newHobby = {
                new Hobby("Comics", "09/25/2012", "The Comic Store", 1),
                new Hobby("Baseball", "09/30/2012", "Fenway Park", 3),
                new Hobby("Programming", "09/212/2012", "Home", 6),
                new Hobby("Board Games", "09/01/2012", "Tom's House", 3),
                new Hobby("Watching Dr. Who", "09/27/2012", "Home", 1) };

        String personChoice;
        Scanner hobbyScan = new Scanner(System.in);
        do {

            String fName;
            String lName;
            int age;
            String address;
            String hobbyName;
            String partDate;
            String location;
            double duration;
            int userHobby;
            String hobbyChoice;

            System.out.println("What is your first name?");

            fName = hobbyScan.nextLine();

            System.out.println("What is your last name?");
            lName = hobbyScan.nextLine();

            System.out.println("What is your address?");

            address = hobbyScan.nextLine();

            System.out.println("What is your age?");

            age = hobbyScan.nextInt();
            hobbyScan.nextLine();

            do {

                System.out
                        .println("What hobbies would you like to do?\n"
                                + "choose between     Comics(0)\nBaseball(1)\nProgramming(2)\nBoard Games(3)\nWatching Dr.Who(4)\n"
                                + "\nEnter    the name of the hobby and then press enter");

                userHobby = hobbyScan.nextInt();
                hobbyScan.nextLine();

                System.out
                        .println("Would you like to add another hobby? (enter yes/no)");

                hobbyChoice = hobbyScan.nextLine();

                Person.setHobby(newHobby[userHobby]);

            } while (hobbyChoice.equals("yes"));

            System.out
                    .println("Would you like to add another person? (enter yes/no)");
            personChoice = hobbyScan.nextLine();

            int i = 0;

            Person[] newPerson = new Person[5];
            newPerson[i] = new Person(fName, lName, address, age);

            System.out.println(newPerson[i].toString());

            i++;

        } while (personChoice.equals("yes"));

    }

}




//--------------------Hobby--------------------
public class Hobby {

    private String hobbyName;
    private String partDate;
    private String location;
    private double duration;

    Hobby(String h, String p, String l, double d) {
        hobbyName = h;
        partDate = p;
        location = l;
        duration = d;

    }

    public String toString() {
        return hobbyName + " " + partDate + " " + location + " " + duration;
    }

    public void setDuration(double d) {
        d = duration;
    }

    public double getDuration() {
        return duration;
    }

}
4

2 に答える 2

1

問題は次のとおりです。

public String printHobbies() {
    for (int j = 0; j < myHobbies.length; j++)
        hobbyText = myHobbies[j].toString();    
    return hobbyText;
}

まず、各ループで文字列を上書きします。書く

hobbyText += myHobbies[j].toString();

2 つ目は、5 つの Hobbies を追加しないと NPE が発生します。これは、配列内のすべての項目が最初は null であるためです。

したがって、myHobbies[j] が null でないかどうかを確認する必要があります。

public String printHobbies() {
    for (int j = 0; j < myHobbies.length; j++) {
        if(myHobbies[j] != null) {
            hobbyText += myHobbies[j].toString();
        }
    }  
    return hobbyText;
}

Collections も参照してください: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html

于 2012-09-26T14:07:12.040 に答える
1

コードに問題を引き起こす可能性のあるバグはほとんどありませんが、現在の使用状況によって異なります。

  1. 合計期間はリセットしません。つまり、最初の呼び出しの後にのみ適切な結果が返されます。それ以外の場合は、呼び出し回数が乗算されます。

    public double printDuration() {
        for (int k = 0; k < myHobbies.length; k++)
            totalDuration += myHobbies[k].getDuration();
        return totalDuration;
    }
    
  2. 固定サイズ 5 の単純な配列を使用します。これは、趣味を 5 つ以上追加すると、 がスローされることを意味しますIndexOutOfBoundsException

  3. toString()設定されているにもかかわらず、配列内のすべての趣味でメソッドを呼び出します。配列はnullデフォルトで に初期化されます。つまり、設定した趣味が 5 つ未満の場合は、nullwhich throws で呼び出そうとしますNullPointerException

    public String printHobbies() {
        for (int j = 0; j < myHobbies.length; j++)
            hobbyText += myHobbies[j].toString();
        return hobbyText;
    }
    
于 2012-09-26T14:08:12.530 に答える