2009-10-17 13 views
0

J'écris deux classes pour gérer des enchères simples. J'ai une classe prête et travaille, qui gère les opérations pour une seule vente aux enchères, et maintenant j'écris une autre classe comme une maison de vente aux enchères, pour garder une trace de toutes les ventes aux enchères disponibles. Lors du test de la partie suivante de la classe:Java NullPointerException

import java.util.ArrayList; 

public class AuctionHouse { 
    private ArrayList<DutchAuction> huutokaupat; 

    public AuctionHouse() { 
    } 

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

intérieur d'une méthode principale avec le code suivant ("kauppa" est un objet variable de travail testé et):

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

Je reçois:

Exception in thread "main" java.lang.NullPointerException à ope.auction.dutch.AuctionHouse.addAuction (AuctionHouse.java:13) à ope.auction.dutch.DutchAuctionTest.main (DutchAuctionT est.java:54)

Comment puis-je résoudre le problème?

Répondre

5

Vous n'avez jamais créé ArrayList. Vous avez besoin

private ArrayList huutokaupat = new ArrayList(); 
4

Votre liste de tableaux n'est pas initialisée lorsque vous y ajoutez. Initialiser dans vos constructeurs, ou mieux encore, sur le terrain:

private ArrayList huutokaupat = new ArrayList(); 
1

huutokaupat n'est pas initialisé?

0

Ajouter au constructeur:

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

Cela va créer un objet ArrayList qui est référencé à partir de la variable huutokaupat.

5

Tout le monde a mentionné la manière Java 1.4 de créer la liste. En Java 5 et plus, la bonne façon de instancier une collection comprendra le type générique ainsi:

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

De plus, à moins que vous devez utiliser des fonctionnalités spécifiques à un ArrayList, il est préférable de définir huutokaupat en utilisant une interface au lieu de la mise en œuvre. Par exemple:

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

si vous avez besoin d'utiliser des méthodes d'interface Liste, ou même

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

si vous avez seulement besoin des méthodes de collecte. L'utilisation d'une interface telle que List ou Collection pour définir le type de variable permet de basculer l'implémentation (ArrayList) avec autre chose dans le futur, et de faire en sorte que ce changement ait des effets minimes sur votre code.