Ah nevermind, the fix is to get rid of "return" from my method.  There's
probably a bug somewhere related to the repl taking bad input more cleanly,
but this isn't the end of the world once you figure out what the issue is.

Thanks for the time,
Andrew


On Mon, Jun 2, 2014 at 11:35 PM, Andrew Ash <and...@andrewash.com> wrote:

> // observed in Spark 1.0
>
> Scala devs,
>
> I was observing an unusual NPE in my code recently, and came up with the
> below minimal test case:
>
> class Super extends Serializable {
>     lazy val superVal: String = null
> }
>
> class Sub extends Super {
>     lazy val subVal: String = {
>         try {
>             "literal"
>         } catch {
>             case _:Throwable => return superVal
>         }
>     }
> }
>
> Save this to a file, open the Spark shell, and load with ":l
> /tmp/test.scala"
>
> I got the below really unusual exception.  It goes away though when
> removing the try/catch inside subVal and just returning either a straight
> literal or superVal.
>
>
> Is this a bug in Spark, or Scala, or my code, or what?  I think it might
> be related to the Spark Repl doing magic but I'm unsure what.
>
> Cheers!
> Andrew
>
>
>
>
> scala> :l /tmp/test.scala
> Loading /tmp/test.scala...
> defined class Super
>
>      while compiling: <console>
>         during phase: mixin
>      library version: version 2.10.4
>     compiler version: version 2.10.4
>   reconstructed args:
>
>   last tree to typer: Apply(constructor $read)
>               symbol: constructor $read in class $read (flags: <method>
> <triedcooking>)
>    symbol definition: def <init>(): $line9.$read
>                  tpe: $line9.$read
>        symbol owners: constructor $read -> class $read -> package $line9
>        context owners: class iwC$Sub -> package $line9
>
> == Enclosing template or block ==
>
> Template( // val <local Sub>: <notype>, tree.tpe=$line9.iwC$Sub
>   "$line5.$read$$iwC$$iwC$$iwC$$iwC$Super" // parents
>   ValDef(
>     private
>     "_"
>     <tpt>
>     <empty>
>   )
>   // 6 statements
>   ValDef( // lazy private[this] var subVal: String
>     private <mutable> <local> lazy <triedcooking>
>     "subVal "
>     <tpt> // tree.tpe=String
>     <empty>
>   )
>   DefDef( // lazy val subVal(): String
>      <method> <stable> <accessor> lazy
>     "subVal"
>     []
>     List(Nil)
>     <tpt> // tree.tpe=String
>     Block( // tree.tpe=String
>       ValDef( // val nonLocalReturnKey1: Object
>         <synthetic> <triedcooking>
>         "nonLocalReturnKey1"
>         <tpt> // tree.tpe=Object
>         Apply( // def <init>(): Object in class Object, tree.tpe=Object
>           new Object."<init>" // def <init>(): Object in class Object,
> tree.tpe=()Object
>           Nil
>         )
>       )
>       Try( // tree.tpe=String
>         Block( // tree.tpe=String
>           Assign( // tree.tpe=Unit
>             $read$$iwC$$iwC$$iwC$$iwC$Sub.this."subVal " // lazy
> private[this] var subVal: String, tree.tpe=String
>             Block( // tree.tpe=String
>               {}
>               Apply( // final private[this] def
> liftedTree1$1(nonLocalReturnKey1$1: Object): String, tree.tpe=String
>                 $read$$iwC$$iwC$$iwC$$iwC$Sub.this."liftedTree1$1" //
> final private[this] def liftedTree1$1(nonLocalReturnKey1$1: Object):
> String, tree.tpe=(nonLocalReturnKey1$1: Object)String
>                 "nonLocalReturnKey1" // val nonLocalReturnKey1: Object,
> tree.tpe=Object
>               )
>              )
>           )
>           $read$$iwC$$iwC$$iwC$$iwC$Sub.this."subVal " // lazy
> private[this] var subVal: String, tree.tpe=String
>         )
>         CaseDef( // tree.tpe=String
>           Bind( // val ex: runtime.NonLocalReturnControl,
> tree.tpe=runtime.NonLocalReturnControl
>             "ex"
>             Typed( // tree.tpe=runtime.NonLocalReturnControl
>               "_" // tree.tpe=runtime.NonLocalReturnControl
>               <tpt> // tree.tpe=runtime.NonLocalReturnControl
>             )
>           )
>           If( // tree.tpe=String
>             Apply( // final def eq(x$1: Object): Boolean in class Object,
> tree.tpe=Boolean
>               ex.key()."eq" // final def eq(x$1: Object): Boolean in class
> Object, tree.tpe=(x$1: Object)Boolean
>               "nonLocalReturnKey1" // val nonLocalReturnKey1: Object,
> tree.tpe=Object
>             )
>             Apply( // final def $asInstanceOf[T0 >: ? <: ?](): T0 in class
> Object, tree.tpe=String
>               TypeApply( // final def $asInstanceOf[T0 >: ? <: ?](): T0 in
> class Object, tree.tpe=()String
>                 ex.value()."$asInstanceOf" // final def $asInstanceOf[T0
> >: ? <: ?](): T0 in class Object, tree.tpe=[T0 >: ? <: ?]()T0
>                 <tpt> // tree.tpe=String
>               )
>               Nil
>             )
>             Throw("ex")tree.tpe=Nothing
>           )
>         )
>       )
>     )
>   )
>   ValDef( // protected val $outer: $line9.iwC
>     protected <synthetic> <paramaccessor> <triedcooking>
>     "$outer "
>     <tpt> // tree.tpe=$line9.iwC
>     <empty>
>   )
>   DefDef( // val $outer(): $line9.iwC
>     <method> <synthetic> <stable> <expandedname>
>     "$line9$$read$$iwC$$iwC$$iwC$$iwC$Sub$$$outer"
>     []
>     List(Nil)
>     <tpt> // tree.tpe=$line9.iwC
>     $read$$iwC$$iwC$$iwC$$iwC$Sub.this."$outer " // protected val $outer:
> $line9.iwC, tree.tpe=$line9.iwC
>   )
>   DefDef( // final private[this] def liftedTree1$1(nonLocalReturnKey1$1:
> Object): String
>     <method> private final <local> <lifted> <triedcooking>
>     "liftedTree1"
>     []
>     // 1 parameter list
>     ValDef( // nonLocalReturnKey1$1: Object
>       <param> <synthetic>
>       "nonLocalReturnKey1$1"
>       <tpt> // tree.tpe=Object
>       <empty>
>     )
>     <tpt> // tree.tpe=String
>     Try( // tree.tpe=String
>       "literal"
>       CaseDef( // tree.tpe=Nothing
>         Typed( // tree.tpe=Throwable
>           "_" // tree.tpe=Throwable
>           <tpt> // tree.tpe=Throwable
>         )
>         Throw( // tree.tpe=Nothing
>           Apply( // def <init>(key: Object,value: Object):
> scala.runtime.NonLocalReturnControl in class NonLocalReturnControl,
> tree.tpe=scala.runtime.NonLocalReturnControl
>             new runtime.NonLocalReturnControl."<init>" // def <init>(key:
> Object,value: Object): scala.runtime.NonLocalReturnControl in class
> NonLocalReturnControl, tree.tpe=(key: Object, value:
> Object)scala.runtime.NonLocalReturnControl
>             // 2 arguments
>             "nonLocalReturnKey1$1" // nonLocalReturnKey1$1: Object,
> tree.tpe=Object
>             Apply( // lazy val superVal(): String, tree.tpe=String
>               $read$$iwC$$iwC$$iwC$$iwC$Sub.this."superVal" // lazy val
> superVal(): String, tree.tpe=()String
>               Nil
>             )
>           )
>         )
>       )
>     )
>   )
>   DefDef( // def <init>(arg$outer: $line9.iwC): $line9.iwC$Sub
>     <method>
>     "<init>"
>     []
>     // 1 parameter list
>     ValDef( // $outer: $line9.iwC
>       <param> <triedcooking>
>       "$outer"
>       <tpt> // tree.tpe=$line9.iwC
>       <empty>
>     )
>     <tpt> // tree.tpe=$line9.iwC$Sub
>     Block( // tree.tpe=Unit
>       // 2 statements
>       If( // tree.tpe=Unit
>         Apply( // final def eq(x$1: Object): Boolean in class Object,
> tree.tpe=Boolean
>            "$outer"."eq" // final def eq(x$1: Object): Boolean in class
> Object, tree.tpe=(x$1: Object)Boolean
>           null
>         )
>         Throw( // tree.tpe=Nothing
>           Apply( // def <init>(): NullPointerException in class
> NullPointerException, tree.tpe=NullPointerException
>             new NullPointerException."<init>" // def <init>():
> NullPointerException in class NullPointerException,
> tree.tpe=()NullPointerException
>             Nil
>           )
>         )
>         Assign( // tree.tpe=Unit
>           $read$$iwC$$iwC$$iwC$$iwC$Sub.this."$outer " // protected val
> $outer: $line9.iwC, tree.tpe=$line9.iwC
>           "$outer" // $outer: $line9.iwC, tree.tpe=$line9.iwC
>         )
>       )
>       Apply( // def <init>(arg$outer: $line5.iwC): $line5.iwC$Super,
> tree.tpe=$line5.iwC$Super
>         $read$$iwC$$iwC$$iwC$$iwC$Sub.super."<init>" // def
> <init>(arg$outer: $line5.iwC): $line5.iwC$Super, tree.tpe=(arg$outer:
> $line5.iwC)$line5.iwC$Super
>         Apply( // val $iw(): $line5.iwC, tree.tpe=$line5.iwC
>
> $outer.$line9$$read$$iwC$$iwC$$iwC$$iwC$$$outer().$VAL1().$iw().$iw().$iw()."$iw"
> // val $iw(): $line5.iwC, tree.tpe=()$line5.iwC
>           Nil
>         )
>       )
>       ()
>     )
>   )
> )
>
> == Expanded type of tree ==
>
> TypeRef(TypeSymbol(class $read extends Serializable))
>
> unhandled exception while transforming <console>
> error: uncaught exception during compilation:
> java.lang.NullPointerException
> java.lang.NullPointerException
> at scala.reflect.internal.Trees$class.Select(Trees.scala:1066)
>  at scala.reflect.internal.SymbolTable.Select(SymbolTable.scala:13)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1$2.apply(Mixin.scala:908)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1$2.apply(Mixin.scala:904)
>  at scala.reflect.internal.Trees$class.deriveDefDef(Trees.scala:1598)
> at scala.reflect.internal.SymbolTable.deriveDefDef(SymbolTable.scala:13)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer.scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1(Mixin.scala:904)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$addCheckedGetters$1$1.apply(Mixin.scala:945)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$addCheckedGetters$1$1.apply(Mixin.scala:945)
>  at
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
> at
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
>  at scala.collection.immutable.List.foreach(List.scala:318)
> at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
>  at scala.collection.AbstractTraversable.map(Traversable.scala:105)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer.addCheckedGetters$1(Mixin.scala:945)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer.addNewDefs(Mixin.scala:1013)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer.scala$tools$nsc$transform$Mixin$MixinTransformer$$postTransform(Mixin.scala:1147)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$transform$1.apply(Mixin.scala:1261)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$transform$1.apply(Mixin.scala:1261)
>  at scala.reflect.internal.SymbolTable.atPhase(SymbolTable.scala:207)
> at scala.reflect.internal.SymbolTable.afterPhase(SymbolTable.scala:216)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1261)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:471)
>  at
> scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:2904)
> at
> scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1280)
>  at
> scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1279)
> at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
>  at scala.reflect.internal.Trees$class.itransform(Trees.scala:1278)
> at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
>  at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
> at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1258)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:471)
>  at
> scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2927)
> at
> scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2925)
>  at scala.collection.immutable.List.loop$1(List.scala:170)
> at scala.collection.immutable.List.mapConserve(List.scala:186)
>  at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2925)
> at
> scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
>  at
> scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
> at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
>  at scala.reflect.internal.Trees$class.itransform(Trees.scala:1297)
> at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
>  at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
> at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
>  at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1258)
> at
> scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:471)
>  at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:227)
> at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
>  at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:464)
> at
> scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
>  at
> scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
> at scala.collection.Iterator$class.foreach(Iterator.scala:727)
>  at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
> at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:431)
>  at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1583)
> at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1557)
>  at scala.tools.nsc.Global$Run.compileSources(Global.scala:1553)
> at
> org.apache.spark.repl.SparkIMain.compileSourcesKeepingRun(SparkIMain.scala:468)
>  at
> org.apache.spark.repl.SparkIMain$ReadEvalPrint.compileAndSaveRun(SparkIMain.scala:859)
> at
> org.apache.spark.repl.SparkIMain$ReadEvalPrint.compile(SparkIMain.scala:815)
>  at
> org.apache.spark.repl.SparkIMain$Request.compile$lzycompute(SparkIMain.scala:1009)
> at org.apache.spark.repl.SparkIMain$Request.compile(SparkIMain.scala:1004)
>  at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:644)
> at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:609)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:796)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at
> org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:814)
> at
> org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)
>  at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:753)
> at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:601)
>  at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:608)
> at org.apache.spark.repl.SparkILoop.loop(SparkILoop.scala:611)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(SparkILoop.scala:621)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(SparkILoop.scala:618)
>  at
> scala.reflect.io.Streamable$Chars$class.applyReader(Streamable.scala:104)
> at scala.reflect.io.File.applyReader(File.scala:82)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SparkILoop.scala:618)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1$$anonfun$apply$mcV$sp$1.apply(SparkILoop.scala:618)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1$$anonfun$apply$mcV$sp$1.apply(SparkILoop.scala:618)
> at org.apache.spark.repl.SparkILoop.savingReplayStack(SparkILoop.scala:150)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1.apply$mcV$sp(SparkILoop.scala:617)
> at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1.apply(SparkILoop.scala:617)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$interpretAllFrom$1.apply(SparkILoop.scala:617)
> at org.apache.spark.repl.SparkILoop.savingReader(SparkILoop.scala:155)
>  at
> org.apache.spark.repl.SparkILoop.interpretAllFrom(SparkILoop.scala:616)
> at
> org.apache.spark.repl.SparkILoop$$anonfun$loadCommand$1.apply(SparkILoop.scala:681)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$loadCommand$1.apply(SparkILoop.scala:680)
> at org.apache.spark.repl.SparkILoop.withFile(SparkILoop.scala:674)
>  at org.apache.spark.repl.SparkILoop.loadCommand(SparkILoop.scala:680)
> at
> org.apache.spark.repl.SparkILoop$$anonfun$standardCommands$7.apply(SparkILoop.scala:294)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$standardCommands$7.apply(SparkILoop.scala:294)
> at
> scala.tools.nsc.interpreter.LoopCommands$LineCmd.apply(LoopCommands.scala:81)
>  at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:748)
> at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:601)
>  at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:608)
> at org.apache.spark.repl.SparkILoop.loop(SparkILoop.scala:611)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply$mcZ$sp(SparkILoop.scala:936)
> at
> org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884)
>  at
> org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884)
> at
> scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
>  at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:884)
> at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:983)
>  at org.apache.spark.repl.Main$.main(Main.scala:31)
> at org.apache.spark.repl.Main.main(Main.scala)
>  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>  at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:606)
>  at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:256)
> at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:54)
>  at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
>
>
> Abandoning crashed session.
>
> scala>
>

Reply via email to