Пробуй ловить блок в Котлине - что вернуть - PullRequest
1 голос
/ 09 апреля 2019
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:

Поскольку e.printStackTrace() относится к типу Unit, согласно Котлину, я вижу ошибку, которая говорит A 'return' expression required in a function with a block body.({...}).

Как я могу сделать эту работу?

Редактировать : я использую stripe-java здесь ..

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

У вас есть функция с типом возврата Subscription.Это означает, что все возможные пути кода в функции должны в конечном итоге возвращать Subscription или выдавать исключение.Как у вас сейчас, ваш код возвращается только в блоке try.Это проблема;если выдается исключение, оно перемещается в блок catch, в котором нет операторов возврата, и после блока catch нет никаких операторов возврата.Это означает, что есть путь к коду, который не дает возврата - следовательно, ошибка.

Существует как минимум два решения этой ошибки:

  1. Не перехватывать исключение;просто позвольте ему всплывать из метода к вызывающей стороне.

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
         Subscription.retrieve("superSecret").cancel(null)
    
  2. Сделайте возвращаемый тип обнуляемым и верните ноль, если выброшено исключение.

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

    Я думал о том, чтобы сделать его обнуляемым, но если я сделаю возвращаемый тип обнуляемым, разве он не выдаст исключение NullPointerException, когда на самом деле выдает ошибку?

    Функция сама не выдастNPE, нет.И так как тип возвращаемого значения теперь обнуляем, Kotlin заставит вас справиться с этим, когда вы попытаетесь использовать результат.Для получения дополнительной информации см. Null Safety - язык программирования Kotlin .

1 голос
/ 09 апреля 2019

Ваша функция cancelSubscription должна возвращать подписку или ноль, или есть исключение: она этого не делает, поэтому она недействительна

Лучше объяснить в комментарии Slaw, который он не показывал мне до того, как яразмещено: /

...