奇数空指针异常

时间:2013-11-22 06:01:12

标签: java nullpointerexception

我会正确的。 所以我的代码获得了空指针异常。我已经尝试查找导致它的原因以及如何解决它,但这就是为什么我对这个特定的代码感到困惑。它今天早些时候工作得很好,现在它抛出异常。有帮助吗?我可能只是忽略了一些愚蠢的东西,但这令人非常沮丧。代码如下:

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{}

再次感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

那是因为您的列表List<T> stock;仍然未初始化。您需要对其进行初始化,以便能够添加元素或从中删除元素。默认情况下,它是null,因此,当您尝试在其上调用方法时,您会获得NullPointerException

这是因为您根本没有构造函数。 Shop()不是您班级的构造函数。构造函数与类具有相同的名称,因此您需要像这样构造函数

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

Incase,Shop()是一个有效的方法,然后你需要调用这个方法,以便你的列表被初始化,然后才调用其他方法。

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

答案 1 :(得分:1)

更改为构造函数..

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

答案 2 :(得分: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>(); }

答案 3 :(得分:0)

您没有ShopMain的构造函数来初始化您的List

添加:

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

答案 4 :(得分: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>();
    }

在构建类时,将初始化List ...