首页 > 解决方案 > 验证者拒绝类 - Kotlin

问题描述

我正在 Android Studio 中制作应用程序并不断收到“java.lang.VerifyError”。它在我使用@Parcelize 声明的一个类(Place 类)上,以传递一个包含 Place 对象的 ArrayList。我知道它与它自动生成的 writeToParel(Parcel, Int) 方法有关,但这就是我能弄清楚的全部。

我不知道为什么它一直出现,我已经完成了以下推荐的解决方案,但没有任何帮助:以下(类似 SO 帖子上建议的解决方案)不起作用:

我知道自动“打包”是一项实验性功能,所以也许它只是一个错误 - 如果是这样,我可以尝试什么解决方法?

从我创建的 Place 类创建对象时,错误开始。我在下面复制了 Place.kt、log 和 build.grade 的相关部分。提前致谢

地点.kt

@Parcelize
class Place constructor (var name:String, var placeID:String, var 
                     description:String, var photoRef:String,
                     var price:Int, var rating:Int,
                     var location:Array<Double>) : Parcelable {

var googleURL : String
var lat : Double
var lng : Double

// Initialization instructions
init{
    this.lat = location[0]
    this.lng = location[1]
    googleURL = makeGoogleMapsURL()
}
...

日志

06-18 15:55:19.174 5815-5815/com.example.daniel.digit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.daniel.digit, PID: 5815
java.lang.VerifyError: Verifier rejected class com.example.daniel.digit.Place: void com.example.daniel.digit.Place.writeToParcel(android.os.Parcel, int) failed to verify: void com.example.daniel.digit.Place.writeToParcel(android.os.Parcel, int): [0x48] register v3 has type Precise Reference: java.lang.Double but expected Double (Low Half) (declaration of 'com.example.daniel.digit.Place' appears in /data/app/com.example.daniel.digit-5DnxZcCKWzN_9Wj-TMpmIQ==/split_lib_slice_7_apk.apk)
    at com.example.daniel.digit.MainActivity$onCreate$1.onClick(MainActivity.kt:79)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25883)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6642)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

摇篮

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
    experimental = true
}

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.daniel.digit"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.beust:klaxon:3.0.1'
    implementation "org.jetbrains.anko:anko:$anko_version"
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.google.android.gms:play-services-places:15.0.1'
    implementation 'com.google.android.gms:play-services-location:15.0.1'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

标签: javaandroidgradlekotlin

解决方案


我不确定您的课程的用法,但我看到错误提到了,Double所以我的建议是:

  • 除非你真的需要一个Array<Double>which 等价于:Double[]在 ​​java 中,你可以使用: DoubleArraywhich 转换为double[](原始用法会让你的类更容易打包)。

还要尽量让你的课程更简单。data class如果此类的唯一目的是保存数据,并且如果需要所有数据,则可以使用 aconstructor从定义中删除单词:。


推荐阅读