Scala实现可变堆栈抛出异常

时间:2013-04-18 19:23:44

标签: scala

这是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");

不应抛出此异常吗?

2 个答案:

答案 0 :(得分:1)

修复您的pop方法。您的执行顺序导致问题......

 def pop = {
    val ret  = first.itemName
    first = first.next
    ret
  }

答案 1 :(得分:0)

第二次调用pop首先设置为null,然后尝试在该空值上调用方法itemName