为什么在Oracle Java教程中将检查与未检查的异常称为“争议”?


10

我是Java新手,正在阅读有关异常的文档。,尤其是“ 未经检查的异常”-“争议”页面。

底线是:

如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。

我不明白这篇文章。什么是“争议”?你能用简单的话来解释吗?




请查看更新后的问题,我不认为这是重复的问题:)
ABcDexter

3
“我试图阅读它,” -发生了什么事?
没用

2
之所以这样称呼,是因为该主题存在很多争议。另请参阅以下StackOverflow问题:反对检查异常的案例,其中提到了一些著名/有影响力的人物的引用
绿巨人

Answers:


3

我先给你一个例子(但最后是引起争议的答案)。

假设您正在基于Java的文档编辑器中编辑文档,完成后选择“文件”->“另存为...”,然后选择将文档保存到没有写权限的卷中。编辑器不会因为堆栈跟踪而使您崩溃,它只会告诉您它无法保存文件,并且可以让您继续编辑和/或保存到其他位置。

在这种情况下,可能应该检查,捕获并采取行动以从其异常恢复,这是检查异常。

另一方面,假设编程错误导致这些除以零或空指针异常,这些错误仅在某些情况下才抬起丑陋的头。这可能发生在代码中的任何地方,RAM可能会损坏,等等。没有API文档会告诉您“如果RAM损坏,此方法将被零除”

被检查的异常应该是设计的一部分,并且该API的用户应该准备处理它们。未经检查的异常几乎可以在任何地方发生,并且超出了我们的控制范围。

引起争议的是程序员在应使用检查异常时使用非检查异常(从RuntimeException扩展):

  • 作为不被编译器打扰的快捷方式
  • 使他们的签名看起来更简单
  • 因为他们认为检查的异常是一个依赖项问题(如果您在实现类中抛出新的检查的异常,则应该修改接口的签名),反之亦然。

“您应该修改接口的签名”-好吧,编译器甚至迫使您这样做,并且您必须处理或声明要在每个调用站点上抛出的接口。
绿巨人

3
UI应用程序是否以用户友好的方式正确处理了错误,这取决于程序员编写代码的程度。他们可以使用未检查的异常以这种方式很好地编写代码,就像其他人可以不正确地使用已检查的异常处理错误一样。检查异常的目的是使程序员更容易正确地处理错误。争议不是您在这里声称的,而是他们是否真正成功地实现了使错误处理变得更容易的目标。在许多人看来,他们没有这样做。他们使它变得更难。
Servy

@Servy UI应用程序可以通过哪种用户友好的方式来处理RAM芯片故障或由于其他软件出现故障而没有CPU周期的情况?
图兰斯·科尔多瓦

1
@TulainsCórdova在这两种情况下,程序甚至都不会运行,因此在处理期间不会执行任何异常处理,因此当您甚至无法运行任何代码时,如何尝试表示错误就无关紧要了。代码发生时。
Servy '16

1
@TulainsCórdova您不一定非要遇到错误才能处理它,但是是的,编译器不会告诉您可能会抛出该错误。争议在于编译器是否告诉您可能引发异常实际上是有帮助的。有些人认为是,有些人认为不是。这里的问题是什么是争议,那就是答案。您不是关于检查异常的核心争议的陈述。
Servy '16

-4

该页面上没有争议。这是Oracle告诉人们使用检查的异常。

他们在这里发明的虚假“争议”是语言设计者和语言用户之间的争论。设计师允许人们扔掉并抓住(在他们心中)不应扔掉或抓住的东西。因此,他们创建了一个抱怨懒惰的开发人员的网页。


4
还有就是即使该页面一点说,关于它的争论。该问题的答案是“有争议的”,“检查异常是否有助于还是阻碍了更好软件的开发?” 并且,“如果是这样,应该检查哪些异常,不检查哪些异常?” 我敢打赌,如果您在一个房间内有足够的开发人员(和啤酒)来回答这些问题,则可以开始进行生动的讨论。
所罗门慢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.