使用ArrayList和继承的问题

时间:2014-11-07 23:05:33

标签: java inheritance arraylist

我一直在尝试实现一个超类来减少程序中的代码长度。该程序是一个活动计划器,用户将决定是否要输入家庭,学校或其他活动。现在,我正在尝试将部分完成的实例添加到ArrayList,然后我尝试访问该部分完成的实例并为其指定开始时间和结束时间。以下是一些代码:

ArrayList由:ArrayList<Activity> aList = new ArrayList();

创建

主要方法:

System.out.println("*****************");
System.out.println("**Home Activity**");
System.out.println("*****************");
System.out.println("\n** Name **");
String tempName = keyboard.nextLine();
System.out.println("**Description **");
String tempDescr = keyboard.nextLine();
aList.add(new Activity(tempName, tempDescr, "Home")); 
main.startTime(aList, listCount); // This line is where I get my error
main.endTime(aList, listCount);
// Methods aren't static so I need instance of class (main) 

再往下是我的startTime方法:

// Creates a startTime for the instance
public void startTime(ArrayList<Activity> list, int listCount)
    {
        DayPlanner main = new DayPlanner();

        System.out.println("\n******Start Time*******");
        int intYear = main.yearInput();
        String tempMonth = main.monthInput();
        int intDay = dayInput();
        int intHour = hourInput();
        int intMinute = minuteInput();

        list.get(listCount).setStart(tempMonth, intDay, intYear, intHour, intMinute);
        // Line above is also where I get my error
    }

setStart在我的Activity Class中:

public class Activity {

    protected String type;
    protected String activityName;
    protected Time startTime; // Default Time
    protected Time endTime; // Default Time
    protected String activityDescription;

    public void setStart(String month, int day, int year, int hour, int minute)
    {
        this.startTime.setDate(month, day, year, hour, minute);
    }

setDate在我的时间等级中:

public void setDate(String month, int day, int year, int hour, int minute)
    {
        if (dateOK(month, day, year, hour, minute))
        {
            this.month = month;
            this.day = day;
            this.year = year;
            this.hour = hour;
            this.minute = minute;
        }

        else
        {
            System.out.println("Improper date set. Please try again.");
            System.exit(0);
        }
    }

我为跳来跳去道歉,但我似乎无法弄清楚我做错了什么!我遇到的问题是 NullPointerException

这是我的错误的输出。正如您所看到的,我只能在我的开始时间结束时输入,因此当我尝试将开始时间分配给ArrayList中的元素时,会发生一些事情。

******Start Time*******
** Year ** 
2000
** Month ** 
august
** Day ** 
09
** Hour ** 
5
** Minute ** 
61
Not valid minute. Range is [0-59].
** Minute ** 
59
Exception in thread "main" java.lang.NullPointerException
    at pkg2430ass1.Activity.setStart(Activity.java:50)
    at pkg2430ass1.DayPlanner.startTime(DayPlanner.java:304)
    at pkg2430ass1.DayPlanner.main(DayPlanner.java:50)
Java Result: 1

2 个答案:

答案 0 :(得分:0)

我相信您的问题出在startTime.setDate(month, day, year, hour, minute);

您确定startTime是否已初始化?

答案 1 :(得分:0)

protected Time startTime; // Default Time
protected Time endTime; // Default Time
protected String activityDescription;

public void setStart(String month, int day, int year, int hour, int minute)
{
    this.startTime.setDate(month, day, year, hour, minute);
}

您所概述的内容Default Time不是这样的。只有declared的每个对象都是null。你需要initialize之前,先判断它的属性(或者在对象上调用方法 - 你仍然可以将它作为参数传递给它)

protected Time startTime

是声明

protected Time startTime = new Time();

是一个声明,后跟初始化。在初始化对象之前,它是null,除非已为该声明分配了值,否则不能用于访问。

如果你不想初始化一个对象,除非你真的需要它,你应该考虑使用:

public void setStart(String month, int day, int year, int hour, int minute)
{
    if (this.startTime == null){
       this.startTime = new Time();
    }
    this.startTime.setDate(month, day, year, hour, minute);
}

ps。:根据您使用的Time类的类型,可能没有没有参数的构造函数。