2013-11-22 94 views
-1

我會盡力而爲。 所以我得到一個空指針異常的代碼。我試着查找是什麼原因以及如何修復它,但這就是爲什麼我對這個特定代碼感到困惑。今天早些時候它工作得很好,現在它拋出了例外。任何幫助?我可能只是忽略了一些愚蠢的東西,但這很令人沮喪。代碼如下:發生在運行時奇數空指針異常

import java.util.*; 
import java.io.*; 

public class ShopMain<T> { 
List<T> stock; 


public void Shop() { stock = new LinkedList<T>(); } 

public T buy() { return stock.remove(0); } 

void sell(T item) { stock.add(item); } 

void buy(int n, Collection<? super T>items) { 
    for (T e : stock.subList(0, n)) { 
    items.add(e); 
    } 
    for (int i=0; i<n; ++i) stock.remove(0); 
} 

void sell(Collection<? extends T> items) { 
    for (T e : items) { 
    stock.add(e); 
    } 
} 


public static void main (String[] args) { 
ShopMain<Marker> paintballShop = new ShopMain<Marker>(); 
Console console = System.console(); 
System.out.println("1 - Test Suite"); 
String input = console.readLine("Please select the corresponding number to your choice.\n"); 
if(input.equals("1")){ 
    Stack<Marker> stack = new Stack<Marker>(); 
    Set<Marker> hashset = new HashSet<Marker>(); 
    System.out.println("Test Suite : Tests List, Stack, HashSet"); 
    paintballShop.sell(new Geo3()); 
    paintballShop.sell(new Ego11()); 
    paintballShop.buy(); 
    paintballShop.buy(2, stack); //Stack use 
    paintballShop.sell(stack); //Stack use 
    paintballShop.buy(3, hashset); //HashSet 
    paintballShop.sell(hashset); //HashSet 
    System.out.println("Tests Complete"); 

} 
} 
} 

異常錯誤:

Exception in thread "main" java.lang.NullPointerException 
    at ShopMain.sell(ShopMain.java:14) 
    at ShopMain.main(ShopMain.java:39) 

這些最後位的對象及其父類剛下課「佔位符」。

public class Marker{} 

public class Geo3 extends Marker{} 

public class Ego11 extends Marker{} 

再次感謝您的幫助。

+0

'Shop()'爲什麼這個函數在那裏,你的意思是構造函數? – Dipak

回答

2

這是因爲您的列表List<T> stock;仍未初始化。你需要初始化它,以便能夠添加元素,並從中刪除元素。默認情況下,它的null,因此,當你嘗試調用它的方法時,你得到NullPointerException

發生這種情況是因爲根本沒有構造函數。 Shop()不是你的類的構造函數。構造函數具有相同的名稱作爲類,因此你需要有你的構造類似這樣

public ShopMain() { stock = new LinkedList<T>(); } 

櫃面,Shop()是一個有效的方法,那麼你需要調用這個方法讓你列表初始化,然後只能調用其他方法。

paintballShop.Shop(); // Call this method to init your list. 
+0

啊,是的。我現在看到了,我感到很傻。感謝所有的答案! – user2985489

1

改變構造..

public ShopMain() { stock = new LinkedList<T>(); } 
0

您不必爲ShopMain一個構造函數初始化您的List

補充一點:

ShopMain() { 
    stock<T> = new ArrayList<T>(); 
} 
1

你可能需要改變:

public void Shop() { stock = new LinkedList<T>(); } 
//doesn't look a method name, may be this is what you missed 

public ShopMain() { stock = new LinkedList<T>(); } 
0

基本上說到做到的事實,stock永遠不會初始化。我想,這個類使用被稱爲Shop

你可以改變...

public class ShopMain<T> { 

    List<T> stock; 

    public void Shop() { 
     stock = new LinkedList<T>(); 
    } 

要...

public class ShopMain<T> { 

    List<T> stock; 

    public ShopMain() { 
     stock = new LinkedList<T>(); 
    } 

類時constructored這將初始化List ..