未经检查的异常(来自C#)与Java特有的异常有何不同?

时间:2010-12-13 18:18:51

标签: c# java exception-handling

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

,您会得到相同的结果吗?

Java使用已检查的异常来解决系统错误(磁盘已满,网络连接错误),并对程序员错误(无效的数组索引,类型转换错误)进行取消选中。没有经过检查的例外情况的语言是否会以另一种方式保持这种区别,或者只是将它们视为一样?


由于有人投票决定接近主观,我会再次强调:我不关心人们认为哪种语言更好。我只是询问程序员在使用不同的异常模型时必须编写的实际操作差异。我只有Java版本的经验,所以我试图找出另一种方式如何工作。

3 个答案:

答案 0 :(得分:3)

两种语言中的例外情况基本没有区别。

唯一不同的是,在Java中,如果未明确捕获或抛出异常(已选中),则会生成编译错误。

C#不会以不同方式处理任何异常。 NullReferenceException基本上与a IOException相同。

使用C#进行编程时,您必须更好地了解可能发生的错误以及可以处理的错误。通过提醒您处理无法控制的内容出错的情况,Java可以让您更轻松。

答案 1 :(得分:1)

检查异常的主要问题是,在某些(很多?)情况下,您编写的代码使得异常永远不会发生,或者您不关心它是否会导致用户“捕获”不可抛出或非抛出异常 - 可恢复的例外,等等。然后你必须考虑用户不关心他们的应用程序是否以检查异常终止的情况,比如说,业余爱好者或学生开发者。现在你必须用可能发生的每个已检查异常来标记每个函数,即使只有你在具有蓝色月亮的火星JVM上运行时才会出现这些异常。

已检查的异常就像C ++中的const正确性一样 - 它们是一个好主意,但语言只有最原始的实现,围绕整个事物的隐喻繁文缛节的数量是非常糟糕的,以至于它可能更容易只是没有该死的东西。

我不知道有任何其他语言检查过例外。

在C ++中没有原始操作抛出,并且没有更多高级操作或库函数抛出。在C ++中通常只有很少的例外。我不能真的代表C#。关于C ++的事情是,如果你得到一个未处理的异常,你的调试器会很容易地告诉你它来自哪里,使得它们的搜索相对简单并且不再需要大量的catch(something) { printfailure("funcname"); abort_program(); }次重复捕获。

答案 2 :(得分:0)

我发现,你会发现,当你第一次需要编写更高级别(可重用)的算法时,Java的检查异常会被破坏。