fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription {
Stripe.apiKey = testApiKey
try {
val sub = Subscription.retrieve("superSecret")
return sub.cancel(null)
} catch (e: StripeException) {
e.printStackTrace()
}
}
Background
:
Kotlin新手在这里尝试将Stripe Billing集成到Kotlin应用程序中。
Problem
:
根据Kotlin的说法,e.printStackTrace()
的类型为Unit
,因此我看到一个错误,显示为A 'return' expression required in a function with a block body.({...})
。
我该如何做?
编辑:我在这里使用stripe-java
。
答案 0 :(得分:3)
您有一个返回类型为Subscription
的函数。这意味着函数中所有可能的代码路径必须最终返回Subscription
或引发异常。如您目前所拥有的,您的代码仅在try
块中返回。这是个问题;如果抛出异常,则它将移入catch
块中,该块没有返回语句,在catch
块之后也没有任何返回语句。这意味着有一条代码路径不会返回任何内容,因此会导致错误。
对此错误至少有两种解决方法:
不捕获异常;只是让它冒出方法来调用方即可。
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
Subscription.retrieve("superSecret").cancel(null)
使返回类型为空,如果引发异常,则返回null。
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =
try {
Subscription.retrieve("superSecret").cancel(null)
} catch (ex: StripeException) {
null
}
我曾考虑过使其可为空,但是如果我使返回类型为可为空,那么当它实际上引发错误时,它不会引发NullPointerException吗?
该函数本身不会抛出NPE,不。而且由于返回类型现在可以为空,因此当您尝试使用结果时,Kotlin将强制您处理该问题。有关更多信息,请参见Null Safety - Kotlin Programming Language。
答案 1 :(得分:1)
您的函数cancelSubscription
必须返回预订或为空
否则会有一个例外,那就是不这样做
在Slaw的评论中有更好的解释,在我发布:/
之前,它没有向我显示