Exception 什么';Kotlin删除已检查异常背后的想法是什么?
当我们在Java中调用抛出异常的方法时,我们如何处理这个问题Exception 什么';Kotlin删除已检查异常背后的想法是什么?,exception,intellij-idea,kotlin,checked-exceptions,Exception,Intellij Idea,Kotlin,Checked Exceptions,当我们在Java中调用抛出异常的方法时,我们如何处理这个问题 我的代码是用kotlin编写的,我使用的是用java编写的第三方库。我调用了这个库的一个方法,它在某些情况下很少抛出自定义异常。现在kotlin不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这一问题的最佳方法是什么?当Java引入检查异常(编译器强制大多数异常被捕获或声明为抛出)时,这是一个相当新的想法。Java是一种比它的大多数前辈更安全的语言:所有行为都在所有平台上定义并保持一致,许多特性都是为了防止崩溃、意外行为或脆弱的
我的代码是用kotlin编写的,我使用的是用java编写的第三方库。我调用了这个库的一个方法,它在某些情况下很少抛出自定义异常。现在kotlin不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这一问题的最佳方法是什么?当Java引入检查异常(编译器强制大多数异常被捕获或声明为抛出)时,这是一个相当新的想法。Java是一种比它的大多数前辈更安全的语言:所有行为都在所有平台上定义并保持一致,许多特性都是为了防止崩溃、意外行为或脆弱的编码,所以检查异常与语言的理念非常吻合 但在此后的几年里,许多人得出结论,检查异常是一个错误。我不完全相信,但以下是一些原因:
- 它们很冗长。方法通常包括许多
…try
块,和/或声明许多异常。此外,如果在抛出异常和捕获异常之间有6个级别的方法调用,则需要用5个方法声明异常 Kotlin删除了Java的许多样板文件,删除了检查异常也符合这一点catch
- 他们鼓励不良行为:
- 试图在错误的地方处理异常,即在错误的抽象级别,在那里没有什么有用的事情可以做
- 无意义的
块(尤其是那些只记录错误的危险块)catch
- 捕获/声明
,而不是特定的子类型异常
- 通过在未检查的异常(如
)中包装已检查的异常进行欺骗RuntimeException
- 它们增加了模块之间的耦合。如果您使用的是添加新异常的库方法,那么所有调用该方法的代码都需要更新以处理或重新调用它
- 它们要求在不同抽象级别之间转换异常(例如,DB访问层可能必须将套接字超时异常转换为数据库不可用异常)。这很繁琐,但为了避免暴露实现细节,这是必要的
- 它们不能很好地处理继承。如果您正在实现/重写的方法没有声明抛出特定的已检查异常,那么您的实现也不能抛出它
- 它们不能很好地与lambda一起工作。在Java中,lambda是使用单个抽象方法接口实现的,因此这些方法必须声明可能的异常(在这种情况下,每个用法都必须处理或声明它),或者lambda主体必须捕获异常。这两个选项都极大地增加了使用lambda所需的概念权重和代码,破坏了它们的主要优点之一的简洁性
Kotlin的实现非常相似(尽管它使用自己的
接口),并且会遇到同样的问题KFunction
至于如何处理您的特殊情况,我建议您像在Kotlin检查异常时一样:查看您调用的方法可以抛出哪些异常,确定如何/在何处最好地处理它们,并处理它们!仅仅因为Kotlin没有强迫你这么做,并不意味着这仍然不是一个好主意 即使在kotlin,你也可以使用try-catch块。@KaushikBurkule,我知道在kotlin中有try-catch。问题是,你如何知道你必须用in-try-catch来包装一段代码,因为kotlin编译器不强制这样做。在定义良好的API中,这应该记录在函数的kotlin文档中。在许多java代码库中都可以看到强制捕获机制,因为声明一个接口以抛出“异常”的反模式被删除,即使实际实现从未抛出任何异常。好的,在kotlin中,我们被迫检查api方法,看看它是否抛出任何异常,并相应地进行处理。这不是有点乏味吗?在Java中,如果不进行处理,就会出现编译时错误。如果我们错过了,它的生产将崩溃,那该怎么办呢?是的,这就是它的规模。我和你一样关心。。。