为了账号安全,请及时绑定邮箱和手机立即绑定

科特林的尝试捕捉块 - 返回什么

科特林的尝试捕捉块 - 返回什么

BIG阳 2022-09-28 15:55:35
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription {        Stripe.apiKey = testApiKey        try {            val sub = Subscription.retrieve("superSecret")            return sub.cancel(null)        } catch (e: StripeException) {            e.printStackTrace()        }    }Background:科特林新手在这里试图将条纹计费集成到科特林应用程序中。Problem:根据 Kotlin 的类型,我看到一个错误,说 .e.printStackTrace()UnitA 'return' expression required in a function with a block body.({...})我怎样才能做到这一点?编辑:我在这里使用。stripe-java
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

您有一个返回类型为 的函数。这意味着函数中所有可能的代码路径最终都必须返回或引发异常。由于您当前拥有它,您的代码仅在块中返回。这是一个问题;如果抛出异常,它将移动到没有返回语句的块中,并且在块之后也没有任何返回语句。这意味着存在导致不返回的代码路径,因此是错误的。SubscriptionSubscriptiontrycatchcatch


此错误至少有两种解决方案:


不要抓住异常;只需让它从方法中冒泡到调用方即可。


fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =

     Subscription.retrieve("superSecret").cancel(null)

使返回类型为 null,并在引发异常时返回 null。


fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =

    try {

        Subscription.retrieve("superSecret").cancel(null)

    } catch (ex: StripeException) {

        null

    }

我想过让它可以为空,但是如果我使返回类型可为空,当它实际抛出错误时,它不会抛出一个 NullPointerException 吗?


函数本身不会抛出 NPE,不。由于返回类型现在是可为空的,因此当您尝试使用结果时,Kotlin 将强制您处理该类型。有关更多信息,请参见空安全 - Kotlin 编程语言。


查看完整回答
反对 回复 2022-09-28
?
动漫人物

TA贡献1815条经验 获得超10个赞

您的函数必须返回订阅或 null,否则存在异常,不这样做,因此它无效cancelSubscription

在Slaw的评论中更好地解释了这一点,在我发布之前它没有向我显示:/


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信