创建数组的NullPointerException?

时间:2013-10-07 09:05:17

标签: scala nullpointerexception

Scala有一个奇怪的缺点,我无法在args中创建默认参数。这是我最近的尝试:

object Main extends java.lang.Object with ScalaObject with App {
    override val args:Array[String]=Array(args.toList.headOption.getOrElse("f"))
    println("args(0) = " + args(0))
}

在此处运行代码:http://ideone.com/B20HBA

  

线程“main”中的异常java.lang.NullPointerException at   scala.collection.mutable.ArrayOps $ ofRef $。长度$扩展(ArrayOps.scala:114)     at scala.collection.mutable.ArrayOps $ ofRef.length(ArrayOps.scala:114)     在scala.collection.SeqLike $ class.size(SeqLike.scala:106)at   scala.collection.mutable.ArrayOps $ ofRef.size(ArrayOps.scala:108)at at   scala.collection.mutable.Builder $ class.sizeHint(Builder.scala:69)at   scala.collection.mutable.ListBuffer.sizeHint(ListBuffer.scala:45)at   scala.collection.TraversableLike $ class.to(TraversableLike.scala:628)     在scala.collection.mutable.ArrayOps $ ofRef.to(ArrayOps.scala:108)at at   scala.collection.TraversableOnce $ class.toList(TraversableOnce.scala:257)     at scala.collection.mutable.ArrayOps $ ofRef.toList(ArrayOps.scala:108)     在Main $ delayedInit $ body.apply(Main.scala:2)at   scala.Function0 $ class.apply $ mcV $ sp(Function0.scala:40)at   scala.runtime.AbstractFunction0.apply $ MCV $ SP(AbstractFunction0.scala:12)     在scala.App $$ anonfun $ main $ 1.apply(App.scala:71)at   scala.App $$ anonfun $ main $ 1.apply(App.scala:71)at   scala.collection.immutable.List.foreach(List.scala:318)at   scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:32)     at scala.App $ class.main(App.scala:71)at Main $ .main(Main.scala:1)     在Main.main(Main.scala)

2 个答案:

答案 0 :(得分:2)

正如@blast_hardcheese所示,你不能有效地将val的值设置为依赖于它自己的表达式,这就是上面代码中发生的事情。

如果你真的需要这样做(我想不出你为什么会这样做),你可以通过在原始值的引用前附加super.来引用原始值:

object Main extends App {
    override val args: Array[String] = if (super.args.isEmpty) Array("f") else super.args
    println("args(0) = " + args(0))
}

请注意,您的原始表达式将丢失除第一个之外的任何提供的参数。这可能是你的意图,但如果不是,你可能想把它改成上面的东西。

答案 1 :(得分:0)

我不相信您可以使用之前的值就地修改值。我知道不可能在方法中重新定义一个值,你要做的是覆盖App mixin中的定义(除非我弄错了,否则会阻止你使用该值)。

除此之外,使用值构造中的值似乎引用null,表明这不受支持。

scala> val l = List(1,2,3,4)
l: List[Int] = List(1, 2, 3, 4)

scala> val l = l.map( _ * 2)
<console>:8: error: recursive value l needs type
       val l = l.map( _ * 2)
               ^

scala> val l: List[Int] = l.map( _ * 2 )
java.lang.NullPointerException
    at .<init>(<console>:8)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    ...