AP计算机科学A(APcomputer science A)复习备考攻略视频教程
42745 人在学
异常处理
结构化的异常处理在两种语言中几乎完全相同。(两者都可以往后追溯到一份创始性的论文,即 Andrew Koenig 和 Bjarne Stroustrup 于 1990 年撰写的 Exception Handling for C++。) 两种语言都使用了两种异常概念:应用程序生成的异常,以及系统运行库(C# 的公共语言运行库,java 语言的 JVM)生成的异常。两种语言都具有 Exception 基类,应用程序异常和系统异常都是由它派生而来的。 图 3 显示了两种语言中的 Exception 类层次。
图3. Java 语言和 C# 中的 Exception 类层次
然而,两种语言的编译器对您的代码如何处理异常具有不同的预期。在 C# 中,您可以选择捕获异常,或让它们沿调用堆栈向上传播到类的方法的调用者(和/或构造函数)。Java 语言允许同样的处理,但是对于未捕获的应用程序异常(也就是 java.lang.Exception 的子类),您必须显式地将它们作为方法声明的一部分来列出。因此 Java 编译器预期您或者自己捕获所有应用程序异常,或者告诉编译器关于未捕捉的异常的信息。例如,假设 Foo 类的构造函数可能抛出一个应用程序异常,那么清单 16 中的 C# 或 Java 代码对各自的编译器来说都不会有问题。
清单 16. 处理应用程序异常
C# Java
... ...
public void someMethod() { public void someMethod() {
try { try {
Foo x = new Foo(); Foo x = new Foo();
} }
catch (applicationException e) catch (Exception e)
{ {
... ...
} }
} }
然而,如果改变代码以使其不捕获异常,那么您就必须改变 Java 方法声明(如清单 17 所示)以避免编译器错误。
清单 17. 未捕获的应用程序异常
C# Java
... ...
public void someMethod() { public void someMethod() throws Exception {
Foo x = new Foo(); Foo x = new Foo();
} }
两种语言在这方面存在的另一个区别在于,在 C# 中,每个捕获块的参数是可选的。如果省略它,那么所有异常都会被捕获。Java 语言不允许这样,而是允许一个等价功能( java.lang.Throwable ),它捕获所有异常类的父类,如清单 18 所示。
清单 18. 捕获所有异常
C# Java
... ...
public void someMethod() { public void someMethod() {
try { try {
Foo x = new Foo(); Foo x = new Foo();
} }
catch catch (Throwable e)
{ {
... ...
} }
} }