【问题标题】:How can I know what exceptions could be throw by a method in Kotlin - Android我如何知道 Kotlin 中的方法可能引发哪些异常 - Android
【发布时间】:2021-09-15 08:47:31
【问题描述】:

Java 中很容易知道何时必须try - catch 一段代码,因为编译器强制你这样做,并且方法声明有throws 关键字和Exceptions 将被抛出。

例如:

void testMethod() throws Exception {
    throw new Exception("test");
}

但在 Kotlin 中会是这样的:

fun testMethod() {
    throw Exception("test")
}

在 Kotlin 中我如何知道某个类提供的一段代码需要为某个 Exception 处理?

我不知道我是否必须处理Exception,或者我是否可以更具体地处理IOExcepcion

2021 年 9 月 16 日编辑:

经过更多的调查,我发现这个“问题”没有解决办法。

2016 年有一个相关问题面临同样的问题:Is there any easy way to see what exceptions a Kotlin function throws?

这个答案很好地恢复了可以做的事情:

如果您想知道 Java 方法在调用时会抛出哪些异常 来自 IntelliJ 的 Kotlin,您可以使用 F1 快捷键拉起 javadoc 并在弹出菜单中查看 throws 声明。

Kotlin 函数可以声明它抛出的异常,使用 @Throws 注释。注释显然是可选的,所以你 可能不能指望这会一直存在。不幸的是,当你 在使用 @Throws 的方法上使用 F1 键盘快捷键,它不会 显示声明要抛出的异常。 Java 调用这些 需要方法来捕获在 注释。

Kotlin javadoc 可以使用@throws javadoc 注解进一步 提供可以在函数中抛出的定义异常。这些 确实出现在 javadoc 和 F1 帮助弹出窗口中。当然这也是 可选。

【问题讨论】:

  • @IR42 感谢您提供文档链接,但在阅读之后,我没有得到任何新信息,他们只是说 kotlin 没有检查异常,因为“那不好”。毕竟我不知道我必须用try catch检查哪一段代码,我必须深入每个类和方法,看看代码是否只是“抛出”异常?我不觉得这很容易......任何帮助将不胜感激

标签: java android kotlin exception


【解决方案1】:

答案是您知道 Kotlin 方法可以抛出哪些异常,除了文档中所说的。 Kotlin 的设计者故意忽略了这个功能。

具体来说,他们得出的结论是,强制捕获异常比它的价值更麻烦。 很多 Java 代码实际上并没有真正处理它应该处理的检查异常,并且最终花费大量样板文件将它们丢弃或记录它们并忽略它们。使用函数式编程处理已检查的异常特别困难,您必须使用可以抛出已检查异常的专用 lambda。

【讨论】:

    【解决方案2】:

    Kotlin doesn't have checked exceptions,因此没有 catch or specify requirement。所以不需要在函数头中指定任何已检查的异常。

    这也意味着 kotlin will not force you to catch checked exceptions 从任何 java 代码中抛出。是否要捕获此类异常取决于您,或者您可以选择不捕获。

    如果你想和java交互,那么你可以使用@Throws

    @Throws(IOException::class)
    fun readFile(name: String): String {...}
    
    // this will be translated to
    
    String readFile(String name) throws IOException {...}
    

    【讨论】:

    • 我理解,但想象一下我从代码中调用 readFile(),编译器什么也没说,所以我没有用 try catch 包围它,readFile() 发现错误并抛出我一个 IOException,我的代码刚刚爆炸并且应用程序关闭。所以......我怎么知道我必须使用这个 readFile() 方法的 try catch 如果任何签名显示它甚至可以抛出异常?我理解@Throws(IOException::class) 但意味着用于与java进行互操作,但想象这段代码仅适用于Kotlin,没有签名,我怎么知道它可以抛出一个IOExeption?
    • 您可以随时阅读readFile 的方法签名以了解它可以抛出哪些异常并根据需要捕获它们。 kotlin 编译器不会报错,即使你没有捕捉到已检查的异常
    • 但是假设你在 readFile 中使用了另一个抛出异常的方法,所以你必须检查 readFile 方法和在 readFile 中调用的其他方法,这看起来像是一个级联方法才能知道当您必须检查异常时。毕竟,在 Kotlin 中,您没有带有“throws”关键字的方法签名,因此很难确定何时尝试 catch……我发现这一切都很混乱……并且必须检查方法到方法……我不知道不明白,看起来很麻烦而且浪费时间......
    • 如果 Java 方法调用抛出检查异常的方法,它必须在签名中声明它,因此您无需深入了解您正在调用的方法的签名.而且,如果您使用的是 Kotlin 库,那么如果设计正确,它不应该在不使用 @Throws 的情况下公开引发检查异常的公共函数。在您的项目代码中,您可以使用 runCatchingResult 类以尽可能低的级别吞下任何已检查的异常。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多