首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin not error warning及其异常处理

Kotlin not error warning及其异常处理
EN

Stack Overflow用户
提问于 2019-12-17 22:29:38
回答 2查看 922关注 0票数 0

我正在使用一个从API获取JSON数据的方法,在Java语言中,每当我使用getJSONObject时,我都必须用一个try/catch来包围这个方法,因为它检测到这个方法抛出了一个JSONException,所以当我的函数被使用时,我希望能够强制程序员在Kotlin中包围我的函数。我想用下面的方法来做这件事:

代码语言:javascript
复制
@Throws(JSONException::class)
    fun parseHitEvents(jsonObject: JSONObject): MutableList<AlgoliaEvent> {
        val hits = jsonObject.optJSONArray("hits")

        val results = ArrayList<AlgoliaEvent>(hits.length()) // Initialize the array list to be of size hits.length

        hits?.forEach<JSONObject> { hit ->
            // Check that each hit is not null
            if (hit == null) return@forEach

            // Parse each hit with a correspond ConciseEvent object
            val event = jsonToObject<ConciseEvent>(hit).apply {
                // We need to get the values from AbstractQuery.LatLng and add them into each event object
                with(hit.getJSONObject("_geoloc")) {
                    _geoloc.lat = getDouble("lat")
                    _geoloc.lng = getDouble("lng")
                }

            // Add the main event in the list of events, so that we can send them as the return value
            results.add(AlgoliaEvent(HitEvent(event)))
        }

        return results
    }

但是,当在另一个文件中调用此方法时,我不会被强制将该方法包含在try/catch中。

有没有办法做到这一点,或者有没有办法以更好的方式实现这种逻辑?

EN

回答 2

Stack Overflow用户

发布于 2019-12-17 23:36:04

Kotlin没有检查过的异常。@Throws只强制Java代码检查异常,对Kotlin代码没有影响。

一种替代方法是使用能够返回所需结果或错误的密封类。

代码语言:javascript
复制
sealed class HitEventsResult {
    data class Success(val value: List<AlgoliaEvent>): HitEventsResult()
    data class Failure(val exception: JSONException): HitEventsResult()
}
代码语言:javascript
复制
fun parseHitEvents(jsonObject: JSONObject): HitEventsResult  {
    try {
        // your original code for getting the results...
        return HitEventsResult.Success(results)
    } catch (e: JSONException){
        return HitEventsResult.Failure(e)
    }
}

然后在调用点:

代码语言:javascript
复制
val hitEventsResult = parseHitEvents(jsonObject)
when (hitEventsResult){
    is Success -> TODO() // do something with result.value
    is Failure -> TODO()
}

或者如果你想重新抛出:

代码语言:javascript
复制
val hitEventsResult = parseHitEvents(jsonObject)
val hitEvents = when (hitEventsResult) {
    is Success -> result.value
    is Failure -> throw result.exception
}
票数 2
EN

Stack Overflow用户

发布于 2019-12-17 22:39:30

在Kotlin中,没有检查异常(Source)。

不需要声明任何异常,也不会强制捕获任何异常。

要指示可以捕获或必须捕获异常,可以使用文档中的@Throw tag

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

https://stackoverflow.com/questions/59376397

复制
相关文章

相似问题

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