1、异常分两大类,一类是继承自 RuntimeException 的异常,另一类是继承自 Exception 的异常 Exception 是必须捕捉的异常,因为这类异常代表程序不可预料的错误,比如程序正在与另一台计算机通过网络进行信息交换时,网线被人剪断,这类异常必须处理 RuntimeException 是可以完全避免的错误,比如空指针异常,只要我们在使用一个引用前先判断一下变量是否为空就可以避免出现,这类异常不必捕捉
2、异常处理的方法一般有两种,或者自己捕捉,然后自己处理,或者抛给你的方法的调用者
3、在异常捕捉语句块中,当语句块中间发生了异常时,被捕捉的语句块中剩下的语句将不会被执行,因此在 try..catch 中,最好把释放资源的语句(比如关闭文件操作)写到 finally 块中,比如
InputStream is1= null; InputStream is2= null; try{ is1= new FileInputStream("C://a.txt"); is2= new FileInputStream("C://b.txt"); // .....
// 如果文件a.txt成功打开,而文件b.txt打开失败,则 try 内部的 is1.close(); 和 is2.close(); 将不会被执行 is1.close(); is2.close(); }catch(IOException ioEx){ // 异常处理代码 }finally{ // 关闭 is1 和 is2 的操作应该放在这里 if(is1!= null){ try{ is1.close(); }catch(Exception ex){} } if(is2!= null){ try{ is2.close(); }catch(Exception ex){} } }
4、如果一个方法中声明了抛出异常 ExceptionA,而在子类中重写了这个方法,那么子类重写的这个方法能够声明抛出的异常是有限制的:或者声明抛出 ExceptionA、或者声明抛出 ExceptionA 的子类,或者不声明抛出异常。 简单点说,如果子类重写父类的方法时,子类重写的方法声明抛出的异常应该比其父类方法声明抛出的异常更精确。 |