“线程中的异常”主“java.util.NoSuchElementException:空列表的头”错误以及Scala中的更多内容

时间:2013-03-29 16:19:53

标签: eclipse list scala compiler-errors

我写了一个递归括号平衡函数,但似乎代码中没有任何错误,但是当我运行它时会出现很多错误。

我用这样的调用编写了这个函数:

if(balance("blarg(arg)".toList)) println("true!") else println("false")

和这样的定义:

def balance(chars: List[Char]): Boolean ={

      implicit class MutableInt(var value: Int) 
      {
          def inc() = { value+=1 } 
          def dec() = { value-=1 }                  
      }

        var stack: Int = 0

        def recursbalance(chars: List[Char], stack: Int): Boolean=
        {

            if ((chars.head: Char) == "(".toList) stack.inc()
            else if ((chars.head: Char) == ")".toList) stack.dec()

            if (stack<0) false

            if (chars.isEmpty: Boolean) if (stack == 0) true else false  

            recursbalance(chars.tail: List[Char], stack: Int)

        }
    recursbalance(chars: List[Char], stack: Int)
}

我收到了这些错误:

Exception in thread "main" java.util.NoSuchElementException: head of empty list
at scala.collection.immutable.Nil$.head(List.scala:337)
at scala.collection.immutable.Nil$.head(List.scala:334)
at recfun.Main$.recursbalance$1(Main.scala:45)
at recfun.Main$.balance(Main.scala:55)
at recfun.Main$.main(Main.scala:16)
at recfun.Main.main(Main.scala)

我该如何解决? 对任何noobness抱歉,我是Scala的新手。

我尝试用这个替换我的递归调用:

   if (chars.isEmpty: Boolean) {
       if (stack == 0) true else false  
   }
   else
       recursbalance(chars.tail: List[Char], stack: Int) 

但我仍然遇到了所有错误..

2 个答案:

答案 0 :(得分:3)

在致电List之前,您需要检查head是否为空,match可能是执行此操作的最佳方式:

  def balance(chars: List[Char]) = {

    def recursbalance(chars: List[Char], stack: Int): Int = chars match {
      case Nil => stack
      case ')' :: tail => recursbalance(tail, stack - 1)
      case '(' :: tail => recursbalance(tail, stack + 1)
      case x :: tail => recursbalance(tail, stack)
    }
    recursbalance(chars, 0) == 0;
  }

我稍微更改了您的方法以移除MutableInt并在内部直接使用Int

我快速检查了一下:

  println(balance("())".toList));
  println(balance("(())".toList));

输出

false
true

答案 1 :(得分:0)

代码中的特定错误是运行时错误。 Scala编译器无法发现它在编译时会失败。这就是为什么代码在IDE中看起来没问题。但是,当您运行它时,错误会显示。它源于以下几行:

def recursbalance(chars: List[Char], stack: Int): Boolean=
{
  if ((chars.head: Char) == "(".toList) stack.inc()

  // ... 

  recursbalance(chars.tail: List[Char], stack: Int)
}

使用列表重复调用recursbalance,该列表比前一个列素短一个元素。所以在某些时候列表是空的,你试图从空列表中取出head元素。那是你得到java.util.NoSuchElementException。

您的代码中还有其他一些要指出的事项。例如,您在if条件中将Char与List [Char](Chars列表)进行比较。这总是评估为假。