猿问

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

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


BIG阳
浏览 83回答 2
2回答

GCT1015

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

动漫人物

您的函数必须返回订阅或 null,否则存在异常,不这样做,因此它无效cancelSubscription在Slaw的评论中更好地解释了这一点,在我发布之前它没有向我显示:/
随时随地看视频慕课网APP

相关分类

Java
我要回答