围绕强制的Scala防御编码

围绕强制的Scala防御编码,scala,utest,Scala,Utest,一个恰当的例子: java.lang.ExceptionInInitializerError at sun.misc.Unsafe.ensureClassInitialized(Native Method) at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43) at sun.reflect.ReflectionFactory.newFie

一个恰当的例子:

java.lang.ExceptionInInitializerError
    at sun.misc.Unsafe.ensureClassInitialized(Native Method)
    at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
    at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142)
    at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
    at java.lang.reflect.Field.get(Field.java:393)
    at utest.runner.BaseRunner.runUTestTask(BaseRunner.scala:30)
    at utest.runner.BaseRunner$$anonfun$utest$runner$BaseRunner$$makeTask$1.apply(BaseRunner.scala:95)
    at utest.runner.BaseRunner$$anonfun$utest$runner$BaseRunner$$makeTask$1.apply(BaseRunner.scala:95)
    at utest.runner.Task.executeInternal(Task.scala:48)
    at utest.runner.Task.execute(Task.scala:19)
    at sbt.TestRunner.runTest$1(TestFramework.scala:76)
    at sbt.TestRunner.run(TestFramework.scala:85)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
    at sbt.TestFunction.apply(TestFramework.scala:207)
这是这一行的副本:

val suite = TestUtils.loadModule(name, testClassLoader).asInstanceOf[TestSuite]
明天我将调试utest以跟踪这个特殊情况,这必须是一个边缘情况,因为它只发生在我的一个启用utest的项目中(可能与目录路径和包对齐有关)


但是,您能否建议一种避免这种反射错误的好的防御编程形式,这样代码就可以在调用
asInstanceOf
之前捕获错误条件,或者,作为替代,捕获块的惯用代码-传达强制失败的原因,以一种更具可操作性的方式?

的安装不是调用。我猜有什么东西在静态初始化器中执行java反射?显然,正在加载一个类,但类init尚未完成。异常在
loadModule
方法中的
asInstanceOf
cast之前抛出<代码>例外初始化错误
本身并不有趣;它只是类的静态初始值设定项中抛出的异常的包装,或者在Scala的情况下,通常在
对象的构造函数中,该异常的
getCause
将提供更多信息,并将告诉您原始异常,是的,确实原因帮助解决了具体问题。我想知道为什么堆栈跟踪似乎跳过了在这种情况下触发异常的上下文(
loadModule
),或者当非方法
asInstanceOf
出现在代码中时,我不知道发生了什么。我想由于JVM的历史原因,我们在Scala堆栈跟踪中永远不会有列位置,或者我们会吗?