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
..
你有一个返回类型为Subscription
的函数。这意味着函数中所有可能的代码路径必须最终返回Subscription
或抛出异常。正如您目前所拥有的那样,您的代码仅在try
块中返回。这是个问题;如果抛出异常,它会移动到没有return语句的catch
块中,在catch
块之后也没有任何返回语句。这意味着有一个代码路径导致没有返回 - 因此错误。
此错误至少有两种解决方案:
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
Subscription.retrieve("superSecret").cancel(null)
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =
try {
Subscription.retrieve("superSecret").cancel(null)
} catch (ex: StripeException) {
null
}
我想过让它可以为空但是如果我使返回类型可以为空,那么当它实际抛出错误时它不会抛出NullPointerException吗?
该函数本身不会抛出NPE,不会。由于返回类型现在可以为空,因此当您尝试使用结果时,Kotlin将强制您处理该类型。有关更多信息,请参阅Null Safety - Kotlin Programming Language。你的函数cancelSubscription
必须返回一个订阅或null或有一个例外是不这样做所以它是无效的
在Slaw的评论中有更好的解释,它在我发布之前没有告诉我:/