Gradle Build Failure:无法找到外层

时间:2018-04-16 21:19:37

标签: gradle kotlin android-gradle

在尝试构建时,我得到了这个堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException: Couldn't find outer class com/xxx/CheckListPresenter$onAttached$1$5 of com/xxx/CheckListPresenter$onAttached$1$5$1
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:1079)
    at com.google.devtools.build.android.desugar.ClassVsInterface.isOuterInterface(ClassVsInterface.java:56)
    at com.google.devtools.build.android.desugar.InterfaceDesugaring.visitOuterClass(InterfaceDesugaring.java:246)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:638)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
    at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477)
    at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361)
    at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314)
    at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711)

我查看了CheckListPresenter课程,但似乎没有任何问题。我尝试删除该类只是为了看它是否会构建,但错误只是转移到另一个类,说明相同的问题。

几个月前我最后一次触摸这段代码是好事,所以我不确定是什么引发了这一变化。

可能重要的事情:这是一个Android项目。这是用Kotlin写的。这在transformClassesWithDesugarForDebug gradle任务

上失败

编辑

这些都是我试过的黑暗中的刺伤:

  • 创建新项目并仅移入我的源代码和gradle文件。

  • 从java 8删除到7.

  • 不同版本的JDK。我试过1.8.0_151和1.8.0_152。

  • javaMaxHeapSize "4g"添加到build.gradle。

  • 升级所有内容:gradle包装器和每个依赖项。

  • 删除Dagger以支持Koin

  • 删除了Kapt

  • 同时使用Android Studio的预览版和稳定版

这是我build scan的好处

新发现:

这是杀死我的代码片段:

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
           v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()
            }, this::onError)

         }, this::onError)
    }

有什么奇怪的,这些中没有一个会给我带来问题

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
            //removed 
         }, this::onError)
    }
}

view?.let { v ->
    v.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
 }

在一起他们是个问题。

需要注意的是,view在基类中定义,并且是通用的。

目前,我的工作是删除view?.let{并使用view!!。这显然是一个错误,但我不确定将其报告给谁。 Gradle,Kotlin,JetBrains,上帝?

4 个答案:

答案 0 :(得分:7)

当我将android.enableD8.desugaring = true添加到gradle.properties

时,问题自行解决了

答案 1 :(得分:1)

我有办法解决此错误:java.lang.NullPointerException: Couldn't find outer class com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1 of com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1$1

移动此块代码

v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()

oo其他方法。我不再遇到这个问题了。我希望这会对你有所帮助。

答案 2 :(得分:1)

问题在此处https://issuetracker.google.com/issues/72750890中提出。 那里提到的两种解决方案都对我有用: 将classpath 'com.android.tools.build:gradle:3.0.1'添加到build.gradle或将android.enableD8.desugaring=true添加到gradle.properties

答案 3 :(得分:0)

作为解决方法,您可以用空检查代替let。此后至少开始编译代码

if (view!=null)
    view.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
}