2009-10-17 146 views
0

我在写两个类来处理简单的拍卖。我有一个课程已准备就绪,可以处理单次拍卖的操作,现在我正在写一个像拍卖行一样的课程,以跟踪所有可用的拍卖。当测试类的以下部分:用下面的代码的主方法内Java空指针异常

import java.util.ArrayList; 

public class AuctionHouse { 
    private ArrayList<DutchAuction> huutokaupat; 

    public AuctionHouse() { 
    } 

    public void addAuction(DutchAuction newAuction) { 
     huutokaupat.add(newAuction); 
    } 
} 

(“kauppa”是测试和工作对象的变量):

AuctionHouse talo = new AuctionHouse(); 
talo.addAuction(kauppa); 

我得到:

线程“main”中的异常java.lang.NullPointerException at ope.auction.dutch.AuctionHouse.addAuction(AuctionHouse.java:13) at ope.auction.dutch.DutchAuctionTest.main(DutchAuctionT est.java:54)

我该如何解决这个问题?

回答

5

您从未真正创建过ArrayList。你需要

private ArrayList huutokaupat = new ArrayList(); 
4

当你添加到它时,你的数组列表不会被初始化。初始化它在你的构造函数,或更好,但在球场上:

private ArrayList huutokaupat = new ArrayList(); 
1

huutokaupat尚未初始化?

0

添加到构造函数:

public AuctionHouse() { 
    huutokaupat = new ArrayList(); 
} 

这将创造出从huutokaupat变量引用一个ArrayList对象。

5

大家都提到了创建列表的Java 1.4方式。在Java 5只及以上,实例化一个集合的正确方法将包括通用型,以及:

ArrayList<DutchAuction> huutokaupat = new ArrayList<DutchAuction>(); 

此外,除非你需要使用特定功能到一个ArrayList,这是更好地定义huutokaupat使用接口而不是执行。例如:

List<DutchAuction> huutokaupat = new ArrayList<DutchAuction>(); 

,如果你只需要使用List接口的方法,甚至

Collection<DutchAuction> huutokaupat = new ArrayList<DutchAuction>(); 

如果你只需要收集方法。使用像List或Collection这样的接口来定义变量类型,可以将实现(ArrayList)与将来的其他类型切换,并且使这个切换对代码的影响最小。