NullPointerException 创建数组?
Posted
技术标签:
【中文标题】NullPointerException 创建数组?【英文标题】:NullPointerException with Array creation? 【发布时间】:2013-10-13 18:50:53 【问题描述】: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$.length$extension(ArrayOps.scala:114) 在 scala.collection.mutable.ArrayOps$ofRef.length(ArrayOps.scala:114) 在 scala.collection.SeqLike$class.size(SeqLike.scala:106) 在 scala.collection.mutable.ArrayOps$ofRef.size(ArrayOps.scala:108) 在 scala.collection.mutable.Builder$class.sizeHint(Builder.scala:69) 在 scala.collection.mutable.ListBuffer.sizeHint(ListBuffer.scala:45) 在 scala.collection.TraversableLike$class.to(TraversableLike.scala:628) 在 scala.collection.mutable.ArrayOps$ofRef.to(ArrayOps.scala:108) 在 scala.collection.TraversableOnce$class.toList(TraversableOnce.scala:257) 在 scala.collection.mutable.ArrayOps$ofRef.toList(ArrayOps.scala:108) 在 Main$delayedInit$body.apply(Main.scala:2) 在 scala.Function0$class.apply$mcV$sp(Function0.scala:40) 在 scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 在 scala.App$$anonfun$main$1.apply(App.scala:71) 在 scala.App$$anonfun$main$1.apply(App.scala:71) 在 scala.collection.immutable.List.foreach(List.scala:318) 在 scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 在 scala.App$class.main(App.scala:71) 在 Main$.main(Main.scala:1) 在 Main.main(Main.scala)
【问题讨论】:
我不认为它是一个“奇怪的缺点”。始终提供参数,但它可以为空。如果您对空参数不满意,则由您的代码负责实现其余逻辑。 【参考方案1】:正如@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))
请注意,您的原始表达式将丢失除第一个之外的任何提供的参数。这可能是您的意图,但如果不是,您可能希望将其更改为上述内容。
【讨论】:
完美,这正是我正在寻找的解决方案,谢谢!另外,如果您愿意,请将其添加为:Default arguments to Scala's main function? 的答案,我也会给您投票+接受的答案;) 您非常慷慨 - 我已尝试在此处修改我的答案以匹配您对问题的替代措辞。【参考方案2】:我不相信您可以使用以前的值就地修改值。我知道在方法中重新定义值是不可能的,您要做的是覆盖 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>)
...
【讨论】:
有什么想法可以在 Scala 中object
的 main
方法中传递默认参数,同时仍使用 args
名称绑定?
为什么要保留args
名称绑定?如果您适当地指定了一个新变量 args2
并使用了它,什么不会起作用?以上是关于NullPointerException 创建数组?的主要内容,如果未能解决你的问题,请参考以下文章
填充数组时出现java.lang.NullPointerException [重复]
对象数组NullPointerException,处理3.3.6 [重复]
ArrayList错误“NullPointerException”
getResources 中的 NullPointerException