我正在使用 Scala 2.9.1 编译一个项目并得到
java.lang.AssertionError: assertion failed
at scala.Predef$.assert(Predef.scala:89)
at scala.tools.nsc.symtab.Symbols$Symbol.accessed(Symbols.scala:1142)
at scala.tools.nsc.symtab.Symbols$Symbol.accessed(Symbols.scala:1138)
at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$buildFieldPositions$1$1.apply(Mixin.scala:1006)
我猜这是一个错误,但我真的没有时间修复它或等待其他人修复它,所以我想改变我正在做的事情,这样我就不会遇到这个错误。
但我遇到了困难,因为我不知道我的代码的哪一部分导致了问题。我可以使用任何策略来隔离问题吗?
为了让调查者更容易,以下是源代码的链接:
- 符号.scala:1142 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src/compiler/scala/tools/nsc/symtab/Symbols.scala#L1142
- 符号.scala:1138 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src/compiler/scala/tools/nsc/symtab/Symbols.scala#L1138
- Mixin.scala:1006 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src/compiler/scala/tools/nsc/transform/Mixin.scala#L1006
具体来说,我还没有解决 Scala 编译器崩溃问题,但我已经解决了其他编译器崩溃问题。您要做的就是尝试缩小导致问题的范围。在大多数项目中,最简单的方法是通过注释进行二分搜索。也就是注释掉大约一半的代码,看看bug是否还会出现。如果没有,请取消注释那一半并注释另一半,看看错误是否仍然发生。然后,假设这有效并且您找到了它发生在哪一半,通过注释将其分成两半。重复这个过程,直到找到仍然会破坏代码的最小代码段。 (显然,由于代码依赖性,您可能并不总是能够做到一半,但至少想办法将其分解成大块)。
当您到达那里时,通过检查,您可能会发现该代码中存在错误,因为根据我的经验,编译器崩溃更可能是由错误形成的代码引起的,而这些代码的形成方式与编译器作者不正确的方式不同。没想到。例如,我自己为工作编写的类似智能感知的 Java 模块会崩溃foo(super).bar
因为我从来没有想象过有人不会在 super 后面加上句点或左括号,但由于语法的设计方式,它可能会通过解析器。当你编写时 Adobe 的 Actionscript 编译器会崩溃var x:int : 10;
而不是var x:int = 10;
(他们现在可能已经解决了这个问题,但我上次使用它时它会崩溃)。因此,如果您确实在代码中发现了错误,请修复它。如果不是,请尝试重写该代码以使其有所不同。希望您能够找到一个不会导致编译器崩溃的版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)