如何解决sbt在编译时抛出AssertionError,并出现无法识别的错误消息
在对代码进行一些小的更改之后,尝试重新编译sbt项目时,我收到了这些奇怪的错误消息。有时,根据所编辑的代码,在清理sbt项目后该错误会消失,但其他时候该错误仍然存在。
错误显示方式(但不会持续存在)的一个示例
将此方法添加到Terrain类并进行编译会产生一条错误消息,该消息在清理项目并重新编译后消失:
def genChunkInputData(p: Vector3i): FloatBuffer = {
val inputData = MemoryUtil.memAllocFloat(4 * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1))
val r = (0 to Chunk.SIZE + 1)
for (i <- r; j <- r; k <- r) {
inputData.put(0.1F + 0.5F*min(i,Chunk.SIZE - i).toFloat/ Chunk.SIZE). //RED
put(0.1F + 0.5F*min(j,Chunk.SIZE - j).toFloat/ Chunk.SIZE). //GREEN
put(0.1F + 0.5F*min(k,Chunk.SIZE - k).toFloat/ Chunk.SIZE).//BLUE
put(isovalue((i + p(2)*Chunk.SIZE).toDouble,(j + p(1)*Chunk.SIZE).toDouble,(k + p(0)*Chunk.SIZE).toDouble)) //ISOVALUE
}
inputData.flip()
inputData
}
以下是错误消息中的一些摘要:
[error] ## Exception when compiling 21 sources to D:\Computer science\Scala\Meandering Depths\target\scala-2.13\classes
[error] java.lang.AssertionError: assertion failed:
[error] List(method apply$mcI$sp,method apply$mcI$sp)
[error] while compiling: D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
[error] during phase: globalPhase=specialize,enteringPhase=explicitouter
[error] library version: version 2.13.3
[error] compiler version: version 2.13.3
[error] reconstructed args:
和
[error]
[error] last tree to typer: Select(Ident(r),foreach$mVc$sp)
[error] tree position: line 77 of D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
[error] tree tpe: (f: Int => Unit): Unit
[error] symbol: (final override) method foreach$mVc$sp in class Range
[error] symbol definition: final override def foreach$mVc$sp(f: Int => Unit): Unit (a MethodSymbol)
[error] symbol package: scala.collection.immutable
[error] symbol owners: method foreach$mVc$sp -> class Range
[error] call site: method $anonfun$genChunkInputData in package game
[error]
[error] == Source file context for tree position ==
[error]
[error] 74 def genChunkInputData(p: Vector3i): FloatBuffer = {
[error] 75 val inputData = MemoryUtil.memAllocFloat(4 * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1))
[error] 76 val r = (0 to Chunk.SIZE)
[error] 77 for (i <- r; j <- r; k <- r) {
[error] 78 inputData.put(0.1F + 0.5F*min(i,Chunk.SIZE - i).toFloat/ Chunk.SIZE). //RED
[error] 79 put(0.1F + 0.5F*min(j,Chunk.SIZE - j).toFloat/ Chunk.SIZE). //GREEN
[error] 80 put(0.1F + 0.5F*min(k,Chunk.SIZE - k).toFloat/ Chunk.SIZE).//BLUE
[error] scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:170)
[error] scala.reflect.internal.Symbols$Symbol.suchThat(Symbols.scala:2024)[error] scala.tools.nsc.transform.SpecializeTypes$SpecializationTransformer.matchingSymbolInPrefix$1(SpecializeTypes.scala:1573)
但是,在按照以下步骤操作之后,如果您选择从Terrain类中删除该方法,它将再次引发类似的错误,但是这一次,源似乎已更改(更改为其他方法,该方法没有问题)之前工作正常)。同样,通过清理构建并重新编译,错误消失了。
以下是错误消息的更改:
[error] last tree to typer: Function(value $anonfun)
[error] tree position: line 150 of D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
[error] tree tpe: Int => Unit
[error] symbol: value $anonfun
[error] == Source file context for tree position ==
[error]
[error] 147
[error] 148 private def isovalue(x: Double,y: Double,z: Double): Float = {
[error] 149 var res = -0.1F
[error] 150 for (i <- 0 until 4)
[error] 151 res += amp(i) * noise(i).noise3_XYBeforeZ(freq(i) * x,freqY(i) * y,freq(i) * z).toFloat
[error] 152 res
[error] 153 }
奇怪的是,有时在执行以下步骤之后,添加了一些代码,编译并获得错误,清理构建并重新编译而没有错误,然后删除了所述代码并进行编译以获取新的错误消息,这显然是新的错误可能来自完全不同的类,在此之前,它的表现还不错。
更重要的是,这实际上是我真正的问题,尽管清洁了构建,有时代码更改仍导致错误持续存在。
错误消息告诉我的信息也很多,这也无济于事,令人困惑的是,有时它似乎指向了错误的来源。但是,我必须承认,我不太了解sbt的工作原理,我只是用它来导入一些库,但是以前没有任何问题。
编辑:显然,它是由scala编译器引起的,而不是sbt本身。错误消息似乎与此类似:https://github.com/scala/bug/issues/9578
我已经测试了该链接中的代码,它确实给出了与我的代码相同的错误类型(错误消息中显示的源再次与该错误无关)。我在项目中使用了微风,所以这似乎是问题的根源。我将尝试将其从项目中删除,看看是否仍然出现错误。
解决方法
我设法找到了问题的根源,正如预期的那样,它与sbt无关,但与Breeze无关。问题恰恰是此公开问题中的一个:https://github.com/scala/bug/issues/9578
我的解决方法是停止使用DenseVector [Int](现在我正在使用DenseVector [Float],但可能很快会切换到其他线性代数库)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。