【发布时间】:2012-03-31 19:29:11
【问题描述】:
考虑以下类定义:
import com.codahale.logula.Logging
abstract class A extends Logging { log.info("from A") }
class C extends A { log.info("from C") }
他们使用Logula,这是一个很棒的 Scala 日志库。
创建C 类的对象效果很好:
new C()
并产生预期的输出:
INFO [2012-03-31 19:16:14,261] C: from A
INFO [2012-03-31 19:16:14,263] C: from C
但是要创建一个 A 的匿名子类的实例
new A() {}
抛出NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at com.codahale.logula.Log$.clean(Log.scala:25)
at com.codahale.logula.Log$.forName(Log.scala:23)
at com.codahale.logula.Log$.forClass(Log.scala:18)
at com.codahale.logula.Logging$class.log(Logging.scala:172)
at A.log(LoggingTraitTest.scala:3)
at A.<init>(LoggingTraitTest.scala:3)
at LoggingTraitTest$$anon$1.<init>(LoggingTraitTest.scala:8)
at LoggingTraitTest$delayedInit$body.apply(LoggingTraitTest.scala:8)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
at scala.App$class.main(App.scala:60)
at LoggingTraitTest$.main(LoggingTraitTest.scala:6)
at LoggingTraitTest.main(LoggingTraitTest.scala)
如果实例化 C 的匿名子类,则会引发类似的异常:new C() {}
为什么这里的显式和匿名类实例化有什么区别?
欢迎任何关于我如何找出正在发生的事情的提示。提前致谢!
【问题讨论】:
标签: scala logging anonymous-class