未经检查的异常(例如C#)与Java风格的异常有何不同?

未经检查的异常(例如C#)与Java风格的异常有何不同?,c#,java,exception-handling,C#,Java,Exception Handling,我已经看到了很多关于Java的检查异常的评论,暗示着在这方面其他的东西(通常是C#)有很大的不同/优势。我对语言战争方面不感兴趣,但我想知道没有检查异常的语言与Java的模型有何不同。如果将所有Java的异常都更改为扩展RuntimeException,会得到相同的结果吗 Java对系统错误(磁盘已满、网络连接错误)使用选中的异常,对程序员错误(无效数组索引、类型转换错误)使用未选中的异常。没有检查异常的语言是以另一种方式保持这种区别,还是一视同仁 既然有人投票认为这是主观的,我要再次强调:我

我已经看到了很多关于Java的检查异常的评论,暗示着在这方面其他的东西(通常是C#)有很大的不同/优势。我对语言战争方面不感兴趣,但我想知道没有检查异常的语言与Java的模型有何不同。如果将所有Java的异常都更改为扩展
RuntimeException
,会得到相同的结果吗

Java对系统错误(磁盘已满、网络连接错误)使用选中的异常,对程序员错误(无效数组索引、类型转换错误)使用未选中的异常。没有检查异常的语言是以另一种方式保持这种区别,还是一视同仁



既然有人投票认为这是主观的,我要再次强调:我不在乎人们认为哪种语言更好。我只是想问程序员在使用不同的异常模型时必须编写代码的实际操作差异。我只有Java版本的经验,所以我试图找出另一种方法是如何工作的。

这两种语言中的异常基本上没有区别

唯一的区别是,在Java中,如果没有显式捕获或抛出某些异常(选中),它们将生成编译错误

C#对任何例外都没有区别对待。
NullReferenceException
基本上与,
IOException
相同


用C语言编程时,您必须更好地了解可能发生的错误以及可以处理的错误。Java通过提醒您处理无法控制的错误而变得更容易。

检查异常的主要问题是,在某些(许多?)情况下,您编写的代码使异常永远不会发生,或者您不在乎异常是否发生,从而迫使用户“捕获”不可丢弃或不可恢复的异常,诸如此类。然后,你必须考虑一个用户不关心他们的应用程序是否被检查异常终止的情况,比如说,业余爱好者或学生开发者。现在,您必须使用可能发生的每个已检查异常标记每个函数,即使是只有在使用blue moon在火星JVM上运行时才会发生的异常

检查异常就像C++中的const correction一样——这是一个很好的主意,但该语言只有最原始的实现,而且围绕整个事情的大量隐喻性繁文缛节是非常糟糕的,以至于可能更容易不拥有这该死的东西

我不知道还有哪种语言检查过异常


在C++中,没有原始操作抛出,而更高级的操作或库函数抛出的则不多。一般来说,C++中的例外情况要少得多。我真的不能代表C。关于C++的事情是,如果你得到一个未处理的异常,你的调试器会很容易地告诉你它来自哪里,使它相对地微不足道地去捕获它们,并且移除对一组<代码> catch(某物)的需要{PrttRebug(“函数名称”);abptja程序();} /Cord:重复捕获。当您第一次需要编写更高级别(可重用)的算法时,Java的检查异常被破坏。

“C#不处理任何异常。”-这是什么意思?@Greg,我忘了完成我的句子。哎呀。修正了。实际上,C#将一些例外情况视为特殊情况。主要的是AccessViolationException。catch(Exception e)不会捕获系统生成的异常。只是一个小提示:是的,如果您将所有Java异常更改为extend
RuntimeException
,您将得到相同的结果。我发现您必须有一个IDE来帮助您维护选中的异常。不幸的是,你需要这样做,但是如果你让IDE解决了这个问题,在我看来这并不是一件头痛的事。@Peter:我从来没有见过一个Java IDE可以为我管理检查过的异常。在Intellice中,(免费版)如果你抛出一个检查过的异常,它会给你两个自动修复。“将异常添加到方法签名”和“用try/catch包围”如果您添加到方法签名,它会组织异常以简化它们,并根据需要将它们添加到任何父接口/重写方法。您可以在嵌套方法中抛出选中的异常,而无需手动更改任何代码。相反,它提供在“抛出”中删除未抛出的选中异常,或将它们(例如从IOException)减少为更具体的异常。如果您需要抛出选中的异常,但父级不允许,您可以将其包装(我不喜欢它更改异常)或使用Thread.stop(checkedException)这允许您抛出选中的异常,因为它是未选中的异常。