【问题标题】:(Not a) Scala compiler bug? (null pointer exception)(不是)Scala 编译器错误? (空指针异常)
【发布时间】:2011-05-22 03:35:23
【问题描述】:

这段代码

v(2,1)  
var m=Array[String]()
def v(f:Int,t:Int)=
{   var move= (10*f+t).toString

    m :+ "21"

}

(将其作为 scala 脚本运行)

在执行 m:+ "21" 行时给出空指针异常。

这个

var m=Array[String]()
def v(f:Int,t:Int)=
{   var move= (10*f+t).toString

    m :+ "21"

}
v(2,1)  

有效。我认为两者都应该工作,这是一个编译器错误。还是我弄错了?

Scala 2.8.1,Windows XP

【问题讨论】:

    标签: scala scala-2.8 nullpointerexception


    【解决方案1】:

    你错了:你试图在变量m被初始化之前访问它。

    请注意,仅仅因为上面带有m 的行位于“有问题”行之前(即抛出异常的位置)并不一定意味着它首先运行。

    我创建了这个类(当你创建它时表现出相同的行为):

    class OrderTest {
      foo(1)
      val l = List("one", "two")
      def foo(i : Int) = println(l(i))
    }
    

    然后用-print选项编译:

    class OrderTest extends java.lang.Object with ScalaObject {
      private[this] val l: List = _;
      <stable> <accessor> def l(): List = OrderTest.this.l;
      def foo(i: Int): Unit = scala.this.Predef.println(OrderTest.this.l().apply(i));
      def this(): test.OrderTest = {
        OrderTest.super.this();
        OrderTest.this.foo(1);
        OrderTest.this.l = immutable.this.List.apply(scala.this.Predef.wrapRefArray(Array[java.lang.String]{"one", "two"}.$asInstanceOf[Array[java.lang.Object]]()));
        ()
      }
    }
    

    你可以很清楚地看到发生了什么

    【讨论】:

    • Facepalm :) 你说的很对。我假设了一个两遍编译阶段,当然这不是它的工作原理
    • 编辑答案以给出 scala 代码等效的完整形式
    • Paul:编译是“两阶段”的——否则编译器在定义后看不到 v 的使用。实际上,即使要编译 Java,您也需要很多阶段,所以我不确定您的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2013-03-22
    • 2020-04-29
    相关资源
    最近更新 更多