NullPointerException 与数组创建? [英] NullPointerException with Array creation?

查看:57
本文介绍了NullPointerException 与数组创建?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Scala has a weird drawback, that I cannot create a default argument in args. Here is my latest attempt:

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 atscala.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)

Exception in thread "main" java.lang.NullPointerException at scala.collection.mutable.ArrayOps$ofRef$.length$extension(ArrayOps.scala:114) at scala.collection.mutable.ArrayOps$ofRef.length(ArrayOps.scala:114) at scala.collection.SeqLike$class.size(SeqLike.scala:106) at scala.collection.mutable.ArrayOps$ofRef.size(ArrayOps.scala:108) 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) at scala.collection.mutable.ArrayOps$ofRef.to(ArrayOps.scala:108) at scala.collection.TraversableOnce$class.toList(TraversableOnce.scala:257) at scala.collection.mutable.ArrayOps$ofRef.toList(ArrayOps.scala:108) at 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) at 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) at Main.main(Main.scala)

推荐答案

正如@blast_hardcheese 所展示的,您不能有效地将 val 的值设置为依赖于自身的表达式,这就是上面代码中发生的情况.

As @blast_hardcheese has shown, you cannot usefully set the value of a val to an expression dependent on itself, which is what is happening in your code above.

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

If you really need to do this (I can't think of a reason why you would), you can reference the original value by appending super. in front of the reference to the original value:

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

请注意,您的原始表达式将丢失除第一个之外的任何提供的参数.这可能是您的意图,但如果不是,您可能希望将其更改为上述内容.

Note that your original expression would lose any provided arguments beyond the first. That may have been your intention, but in case it wasn't, you would want to change it to something like the above.

这篇关于NullPointerException 与数组创建?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆