我正在使用一个从API获取JSON数据的方法,在Java语言中,每当我使用getJSONObject时,我都必须用一个try/catch来包围这个方法,因为它检测到这个方法抛出了一个JSONException,所以当我的函数被使用时,我希望能够强制程序员在Kotlin中包围我的函数。我想用下面的方法来做这件事:
@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中。
有没有办法做到这一点,或者有没有办法以更好的方式实现这种逻辑?
发布于 2019-12-17 23:36:04
Kotlin没有检查过的异常。@Throws只强制Java代码检查异常,对Kotlin代码没有影响。
一种替代方法是使用能够返回所需结果或错误的密封类。
sealed class HitEventsResult {
data class Success(val value: List<AlgoliaEvent>): HitEventsResult()
data class Failure(val exception: JSONException): HitEventsResult()
}fun parseHitEvents(jsonObject: JSONObject): HitEventsResult {
try {
// your original code for getting the results...
return HitEventsResult.Success(results)
} catch (e: JSONException){
return HitEventsResult.Failure(e)
}
}然后在调用点:
val hitEventsResult = parseHitEvents(jsonObject)
when (hitEventsResult){
is Success -> TODO() // do something with result.value
is Failure -> TODO()
}或者如果你想重新抛出:
val hitEventsResult = parseHitEvents(jsonObject)
val hitEvents = when (hitEventsResult) {
is Success -> result.value
is Failure -> throw result.exception
}发布于 2019-12-17 22:39:30
https://stackoverflow.com/questions/59376397
复制相似问题