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()
}
}
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
}