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