这是Stack的可变实现:
class LinkedStackGeneric {
var first : NodeGeneric = _
def isEmpty : Boolean = {
first == null
}
def push(itemName : Any) = {
val oldFirst = first
first = new NodeGeneric(itemName , oldFirst)
}
def pop = {
first = first.next
first.itemName
}
}
class NodeGeneric(val itemName : Any , val next : NodeGeneric) {}
println("*********** testing LinkedStackGeneric *****************")
val generic = new LinkedStackGeneric
generic.push("test")
generic.push("here");
println(generic.isEmpty)
println(generic.pop);
println(generic.isEmpty)
println(generic.pop);
println(generic.isEmpty)
当我运行此代码时,它会生成以下内容:
*********** testing LinkedStackGeneric *****************
false
test
false
Exception in thread "main" java.lang.NullPointerException
at LinkedStackGeneric.pop(LinkedStackGeneric.scala:19)
at StacksAndQueuesTest$.main(StacksAndQueuesTest.scala:37)
at StacksAndQueuesTest.main(StacksAndQueuesTest.scala)
这是导致错误的行:
println(generic.pop);
导致此异常的原因是,我是不是正确地将项目推入堆栈?因为我推了两个项目:
generic.push("test")
generic.push("here");
不应抛出此异常吗?
答案 0 :(得分:1)
修复您的pop
方法。您的执行顺序导致问题......
def pop = {
val ret = first.itemName
first = first.next
ret
}
答案 1 :(得分:0)
第二次调用pop首先设置为null
,然后尝试在该空值上调用方法itemName