【问题标题】:Function showing mysterious behaviors显示神秘行为的功能
【发布时间】:2018-02-08 03:41:40
【问题描述】:

我正在开发一个带有kotlin 帮助的android 应用程序,但问题是基于纯kotlin 基础。以下是显示一些异常行为的函数:

fun CatchThat(funct: () -> Unit){
try {
    funct()
}catch (ex: Error){
    ex.printStackTrace()
}
}

当我在我的代码中使用它时

CatchThat {
// Proprietary Code goes in here
}
  • 调试器无法正常工作(有时)
  • 专有代码根本不执行(有时)

为什么会遇到这种行为,或者我的某些概念有误(可能是lambdas)。欢迎任何帮助或建议。(我是kotlin的tyro)

EDIT 我在专有代码中所做的事情。 我正在尝试调用一个Thread Pool,它又调用了一个网络活动。这是最好的,我可以解释它。我很抱歉。

【问题讨论】:

  • 对我来说,此代码示例有效...您使用的是哪个版本的 kotlin,您提供的专有代码是什么?
  • 你没有得到任何输出?你应该用 Throwable 替换 Error 来捕获异常
  • Kotlin 1.1.2 抱歉,我无法提供专有代码,因为代码是 专有
  • No @crgarridos sometimes 在这里需要注意。相同的代码在某个时间点运行没有错误,下一次变为空白!!!
  • 试着解释你在这段代码中做了什么。 sn-p 是对的。也许启动另一个线程?

标签: java-8 kotlin


【解决方案1】:

我不确定它是否能解决问题,但值得一试,因为您的所有努力都进行了(也因为您的语法没有错误)。 我猜如果调试器在错误的行上停止(或者有时不起作用),这通常意味着 代码缓存中有问题 .

如果您正在使用 Idea,请尝试使 Idea 缓存无效并重新启动。

在此之前

我还建议使用最新版本更新 Kotlin。

【讨论】:

  • 谢谢先生!!第一个粗体行不起作用,但最后一行,即更新到最新版本,即1.1.3 解决了这个问题。非常感谢
【解决方案2】:

try/catch 只会在当前线程上起作用。在你的 sn-p 中,如果在另一个线程中出现一些异常,try/catch 将不起作用

例如:

try {
    println("Hola mundo 1!")
    println(5 / 0)
} catch (ex: Throwable) {
    println("Oups! $ex")// will be printed
}

try {
    Thread {
        println("Hola mundo 2!")
        println(5 / 0)
    }.start()
} catch (ex: Throwable) {
    println("Oups! $ex")// won't be printed
}

println("Hola mundo 3!")//The exception thrown in the external thread don't kill the current thread

有关调试问题,请查看Android Studio threaded debugging

【讨论】:

  • 非常感谢@crgarridos 的回答并为它付出了宝贵的时间,但是为什么有时它会给出正确的输出,调试器工作正常,有时代码也会执行?
  • 只是猜测,它可能因您的代码而异,因为您有一个线程池,执行是异步的。然后你可以“随机”在一个或另一个线程中出现异常
  • 也许吧!但再次感谢您付出宝贵的时间并为此 +1!!!!我一定会提到我何时会得到正确的修复
  • 不客气,抱歉没有更干净但是没有代码很难看出问题。我认为您有一些输出,但并非所有代码都执行得很好