Kotlin中的try-catch块-返回什么

时间:2019-04-09 20:50:15

标签: java kotlin return try-catch 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()
        }
    }

Background

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

Problem

根据Kotlin的说法,e.printStackTrace()的类型为Unit,因此我看到一个错误,显示为A 'return' expression required in a function with a block body.({...})

我该如何做?

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

2 个答案:

答案 0 :(得分:3)

您有一个返回类型为Subscription的函数。这意味着函数中所有可能的代码路径必须最终返回Subscription或引发异常。如您目前所拥有的,您的代码仅在try块中返回。这是个问题;如果抛出异常,则它将移入catch块中,该块没有返回语句,在catch块之后也没有任何返回语句。这意味着有一条代码路径不会返回任何内容,因此会导致错误。

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

  1. 不捕获异常;只是让它冒出方法来调用方即可。

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
         Subscription.retrieve("superSecret").cancel(null)
    
  2. 使返回类型为空,如果引发异常,则返回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的评论中有更好的解释,在我发布:/

之前,它没有向我显示