Java Puzzlers ——异常

a)         finally:finally语句块总是在控制权离开try块时被执行。当在finally中出现意外结束(continue, break和return)时,try中的意外结束将被丢弃。所以每一个finally都应该正常结束,不能用意外结束(return, break, continue或者throw)退出一个finally块(但是如果在finally中有受检查的异常存在,那么还是需要在finally中用try-catch处理),并且不能让受检查的意外传播到finally块之外。(意外结束不包括System.exit所导致的程序退出,这一类的退出将停止所有的程序线程。如果try中有System.exit,那么finally将不会获得调用)
b)        如果一个catch要捕获一个E类型的异常,而其对应的try子句没有抛出E类异常,会产生编译异常。(但是如果E类型为Exception或Throwable,那么try子句抛不抛出都是可以的。)
c)        在多重继承里,一个方法可以抛出的受检查异常集合是它所使用(继承)的所有类型声明要抛出的受检查异常的 交集
d)        Java不允许静态初始化操作抛出受检查异常,因而初始化必须包装在try-finally语句块中。
e)         通常必须重构一个程序,以消除由明确赋值规则(Java规定空 final域只有在其未被赋值的地方才能被赋值。)引发的错误,通常可以考虑添加一个新方法。
f)         实例变量 (fields) 初始化操作先于构造器。构造器必须声明其实例初始化操作会抛出的所有受检查异常。(通过添加一个助手方法为fields赋值,可以避免这种情况。)如果对于设计的类中,其fields包含同样属于这个类的field,那么必须意识到其可能产生无限递归。
g)        不使用异常控制循环,如:
// int array[i]
try{
 int i = 0;
 while(true){ i++;…}
}catch(ArrayIndexOutOfBoundsException e){…}
而使用array.length判断数组越界否(这在《高质量的Java程序设计》中也有提及)
h)        编写一个监测类丢失的程序,应该使用反射来引用而不是使用通常的方法(如new TestClass(),然后用catch试图捕获NoClassDefFoundError),新方法的示例:
try{
 Object m = Class.forName(“Missing”).newInstance();
}catch(ClassNotFoundError e){…}
由上面可见,不要产生对NoClassDefFoundError的依赖,因为类被加载的时机是不可预测的。而捕获Error及其子类一般都是不恰当的。

你可能感兴趣的:(java,C++,c,F#,C#)