首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用kotlin构建android应用抛出异常Back-end (JVM)内部错误:生成了错误字节码

用kotlin构建android应用抛出异常Back-end (JVM)内部错误:生成了错误字节码
EN

Stack Overflow用户
提问于 2021-05-25 19:06:28
回答 1查看 87关注 0票数 0

我有一个android项目,在kotlin中有一个util类来做所有的网络请求,这件事,我做了另一个助手类来管理请求的响应。

接口Session

代码语言:javascript
复制
interface Session : Serializable {
    suspend fun <T> withSession(callback: suspend (headers: Map<String, String>) -> ApiResponse<T>): T
    suspend fun refreshSession(params: HashMap<String, String>)
}

接口Session的实现

代码语言:javascript
复制
class ApiSession(
    token: String,
    private val refreshToken: String) : Session {

    private val headers: HashMap<String, String> = HashMap()

    init {
        headers["Authorization"] = "Bearer $token"
    }

    override suspend fun <T> withSession(callback: suspend (headers: Map<String, String>) -> ApiResponse<T>): T {
        val response = callback(headers)

        if (response.ok)
            return response.data

        //TODO: Retry connection or exception
        return response.data
    }

    override suspend fun refreshSession(params: HashMap<String, String>) {
        TODO("Not yet implemented")
    }
}

SuccessCallback定义:

代码语言:javascript
复制
typealias SuccessCallback<T> = (response: T?) -> T

问题出在帮助器类NetworkFunnel的下一个方法上,

其中,requestQueue是一个Volley.newRequestQueue(context)对象

当我有这个的时候:

代码语言:javascript
复制
private suspend fun <T : Jsonable<T>> requestWithSession(session: Session, url: String, method: Int, body: JSONObject?, clazz: Class<T>, onSuccess: SuccessCallback<T>): T {
    val response = session.withSession { headers ->

        return@withSession suspendCoroutine<ApiResponse<T>> { cont ->
            val req = object : JsonObjectRequest(method, url,
                body ?: JSONObject(),
                {response ->
                    val instance = clazz.newInstance()
                    val apiResponse = ApiResponse(true, instance.fromJsonObject(response))
                    cont.resume(apiResponse)
                },
                {error ->

                }
            ) {
                override fun getHeaders() = headers
            }

            requestQueue.add(req)
        }
    }

    return onSuccess(response)
}

编译时,抛出下一个错误:

代码语言:javascript
复制
e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: wrong bytecode generated

但是当我像这样分发上面的方法时:

代码语言:javascript
复制
private suspend fun <T : Jsonable<T>> requestWithSession(session: Session, url: String, method: Int, body: JSONObject?, clazz: Class<T>, onSuccess: SuccessCallback<T>): T {
    val response = session.withSession { headers ->

        return@withSession suspendCoroutine<ApiResponse<T>> { cont ->
            val req = parseResponse(cont, headers, url, method, body, clazz)

            requestQueue.add(req)
        }
    }

    return onSuccess(response)
}

private fun <T : Jsonable<T>> parseResponse(cont: Continuation<ApiResponse<T>>, headers: Map<String ,String>, url: String, method: Int, body: JSONObject?, clazz: Class<T>): JsonObjectRequest {
    return object : JsonObjectRequest(method, url,
        body ?: JSONObject(),
        {response ->
            val instance = clazz.newInstance()
            val apiResponse = ApiResponse(true, instance.fromJsonObject(response))
            cont.resume(apiResponse)
        },
        {error ->

        }
    ) {
        override fun getHeaders() = headers
    }
}

一切都很顺利,请求也按预期进行了,有人知道这里发生了什么吗?我很迷茫..。

我使用的是kotlin版本的1.3.72

EN

回答 1

Stack Overflow用户

发布于 2021-05-25 19:31:54

您可以使用gradlew assembleDebug --stacktrace --debug找出具体错误的原因。

此外,您可以尝试升级kotlin的版本以重新编译该程序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67686699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档