使用 kotlin 构建 android 应用程序时抛出异常"Back-end (JVM) Internal error: wrong bytecode generated"



我有一个android项目,在kotlin中有一个util类,用于处理所有网络请求,事情是,我已经做了另一个助手类来管理在使用会话进行请求时的响应。

接口Session:

interface Session : Serializable {
suspend fun <T> withSession(callback: suspend (headers: Map<String, String>) -> ApiResponse<T>): T
suspend fun refreshSession(params: HashMap<String, String>)
}

接口Session:的实现

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定义:

typealias SuccessCallback<T> = (response: T?) -> T

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

其中requestQueueVolley.newRequestQueue(context)对象

当我有这个:

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)
}

当compile时,抛出下一个错误:

e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: wrong bytecode generated

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

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

您可以使用gradlew assembleDebug --stacktrace --debug来查找特定错误的原因。

此外,您可以尝试升级kotlin的版本以再次编译程序

相关内容

最新更新