Java 尝试在Kotlin中使用catch block--返回什么

Java 尝试在Kotlin中使用catch block--返回什么,java,kotlin,return,try-catch,stripe-payments,Java,Kotlin,Return,Try Catch,Stripe Payments,背景: Kotlin新手正在尝试将条带计费集成到Kotlin应用程序中 问题: 根据Kotlin的说法,由于e.printStackTrace()属于Unit类型,因此我看到一个错误,该错误表示具有块体的函数中需要一个“return”表达式。({…}) 我怎样才能做到这一点 编辑:我在这里使用的是stripejava 您的函数cancelSubscription必须返回订阅或空值 或者有一个例外是不这样做,所以它是无效的 在Slaw的评论中有更好的解释,在我发布之前,它没有显示给我://你有一个

背景

Kotlin新手正在尝试将条带计费集成到Kotlin应用程序中

问题

根据Kotlin的说法,由于
e.printStackTrace()
属于
Unit
类型,因此我看到一个错误,该错误表示
具有块体的函数中需要一个“return”表达式。({…})

我怎样才能做到这一点


编辑:我在这里使用的是
stripejava

您的函数
cancelSubscription
必须返回订阅或空值 或者有一个例外是不这样做,所以它是无效的


在Slaw的评论中有更好的解释,在我发布之前,它没有显示给我://

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

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

  • 不要捕捉异常;让它从方法中冒泡出来,传递给调用方

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription {
            Stripe.apiKey = testApiKey
            try {
                val sub = Subscription.retrieve("superSecret")
                return sub.cancel(null)
            } catch (e: StripeException) {
                e.printStackTrace()
            }
        }
    
  • 使返回类型为null,如果引发异常,则返回null

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
         Subscription.retrieve("superSecret").cancel(null)
    

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

    函数本身不会抛出NPE,不会。由于返回类型现在可以为null,所以当您尝试使用结果时,Kotlin将强制您处理该问题。有关详细信息,请参阅


  • 该方法必须返回
    订阅
    ,但只能在
    try
    中执行。如果抛出异常,那么该方法应该返回什么?。看起来它试图返回
    printStackTrace
    的结果,它是
    单元
    而不是
    订阅
    。至少有两种解决方案:(1)让异常冒泡而不是捕获它,或者(2)使返回类型为null,并在抛出异常时返回null。或者将返回类型设置为某种可选类型,并在引发异常时返回空值。我曾考虑将其设置为可为Null,但如果将返回类型设置为可为Null,那么它在实际引发错误时不会引发NullPointerException吗?另外,让异常冒泡是什么意思??返回null是否可接受完全取决于调用此方法的代码对返回值的处理方式。Kotlin有很多方法来防止空值。至于让异常冒泡,@Slaw的意思是根本不捕捉异常。这样,调用此函数的任何对象都可以处理它。或者任何调用该函数的东西。异常将在调用堆栈中“冒泡”,直到遇到try/catch块。我想我将使用冒泡。谢谢,@Slaw和@Jordan!
    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =
        try {
            Subscription.retrieve("superSecret").cancel(null)
        } catch (ex: StripeException) {
            null
        }