当前位置: 首页 > 知识库问答 >
问题:

为什么Kotlin不明确要求try-and-catch

裴成文
2023-03-14

例如:

FileOutputStream("file") 

将在Kotlin中编译,但在Java中会出现编译器错误。为什么?

共有2个答案

孟胤
2023-03-14

在不让一些观点干扰的情况下很难回答。我只想说静态编程语言是针对大型软件项目的,并给你静态编程语言团队关于检查异常的说法(来自https://kotlinlang.org/docs/reference/exceptions.html):

检查违例

静态编程语言没有检查异常,原因有很多,但我们将提供一个简单的例子。

以下是StringBuilder类实现的JDK的示例接口:

Appendable append(CharSequence csq)抛出IOException;这个签名说什么?它说每次我将字符串附加到某物(StringBuilder、某种日志、控制台等)时,我都必须捕获那些IOExceptions。为什么?因为它可能正在执行IO(Writer也实现了Appendable)...所以它会导致到处都是这种代码:

try {
    log.append(message)
}
catch (IOException e) {
    // Must be safe
}

这是不好的,见有效Java,第65条:不要忽视例外。

Bruce Eckel在《Java是否需要检查异常?》中说:

对小程序的检查得出的结论是,需要异常规范既可以提高开发人员的生产率,也可以提高代码质量,但大型软件项目的经验表明了不同的结果——生产率降低,代码质量几乎没有提高。

其他此类引文:

Java的检查异常是一个错误(罗德·沃尔德霍夫)

检查异常的麻烦(Anders Hejlsberg)

单于耘豪
2023-03-14

Kotlin消除了Java的检查异常。编译时检查的异常和在方法签名中声明的异常,虽然Java开发人员很熟悉,但在Java社区内外都被广泛认为是失败的实验。

因此,静态编程语言取消了它们,并取消了一些与使用资源(如FileOutputStream)相关的样板文件,以及Java7的try-with-资源的. use方法简写。

 类似资料:
  • 问题内容: Java7的try-with-resources非常好,但是我无法绕开为什么需要在语句中包括资源声明的问题。我的直觉说以下应该是可能的: las,这会导致语法错误(含糊地期待a )。将类型定义/声明移动到语句中是可行的,这当然会将事物移动到相应的范围内。当我想从封闭中获得更多收益时,我可以弄清楚该如何解决,我对 为什么 编译器需要这样的东西很感兴趣。 问题答案: 您的版本未明确定义应关

  • 下面的try with resources语句是来自Java文档的示例 根据文件, 用资源尝试语句确保每个资源在语句末尾关闭。 我的问题是,为什么我需要在try关键字之后立即在括号内声明资源。(如上面的BuffereReader) BufferReader实现了java。lang.AutoCloseable 所以为什么不支持这样的事情, 一旦退出尝试,就隐式关闭资源对象。(正如它所实现的自动关闭)

  • 在为Spring MVC编写云合同时,我们可以选择使用RestAssuredMockMVC或RestAssured。通过RestAssuredMockMVC,我们可以模拟控制器,而不需要启动上下文。通过RestAssured,我们可以使用testmode=explicit通过物理API直接调用控制器。 但是,在使用Reactive Webflux时,我们仅限于RestAssured并且必须创建上下

  • 所以,我正在为一个班级做这个作业。这是一个Java类,我应该做一个游戏,它掷两个骰子,把它们相加,然后把它们加到你的回合分数上。然后它会问你是否想继续玩下去。当你的轮次得分达到20分,或者当你决定通过时,它会进入电脑。它应该打印每个回合的分数,然后当有人得到100分时,它就会宣布胜利者。然而,不管怎样,无论我跑了多少圈,每一圈结束时的分数都是0。当一名玩家掷1时,他们的回合分数被取消,并转移到另一

  • 如图所示,我在主函数之前定义了哈希函数,现在他却回答我“hash”不明确,我不理解

  • C++20概念的一个特点是,在某些情况下,您必须编写。例如,[expr.prim.req]/3中的这个示例: