Kotlin 中的 Try-catch 块——返回什么

Raj*_*Raj 3 java return try-catch kotlin stripe-payments

fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription {
        Stripe.apiKey = testApiKey
        try {
            val sub = Subscription.retrieve("superSecret")
            return sub.cancel(null)
        } catch (e: StripeException) {
            e.printStackTrace()
        }
    }
Run Code Online (Sandbox Code Playgroud)

Background

Kotlin 新手在这里尝试将 Stripe Billing 集成到 Kotlin 应用程序中。

Problem

由于e.printStackTrace()类型为Unit根据科特林,我看到一个错误,指出A 'return' expression required in a function with a block body.({...})

我怎样才能使这项工作?

编辑:我在stripe-java这里使用..

Sla*_*law 7

您有一个返回类型为 的函数Subscription。这意味着函数中所有可能的代码路径最终都必须返回 aSubscription或抛出异常。正如您目前拥有的那样,您的代码仅在try块中返回。这是个问题; 如果抛出异常,它将移动到catch没有 return 语句的catch块中,该块之后也没有任何 return 语句。这意味着存在导致不返回的代码路径——因此是错误。

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

  1. 不要捕捉异常;只是让它从方法中冒出来给调用者。

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
         Subscription.retrieve("superSecret").cancel(null)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使返回类型可以为 null,如果抛出异常则返回 null。

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =
        try {
            Subscription.retrieve("superSecret").cancel(null)
        } catch (ex: StripeException) {
            null
        }
    
    Run Code Online (Sandbox Code Playgroud)

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

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