1.java的基本理念:结构不佳的代码不能让它运行 --《thinking in java》
2.java中将"描述正常执行过程中做什么事“的代码和”出了问题怎么办“的代码相分离,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。
3.如果能很好处理的异常一定不要抛给上层,为上层提供一个干净的接口,最多的隐藏自身的实现细节,降低上层调用当前接口时的复杂性。
4.问题出现了,你也许不清楚该如何处理,但你要清楚你不应该置之不理,有时候,希望把捕获的异常重新抛出,尤其是在使用Exception捕获所有异常的时候。
5.永远不必为异常对象的清理而担心,他们都是用new关键字在堆上婵娟关键的对象所以gc会自动把他们清理掉。
6.你必须清楚,在一个地方的异常,如果没有很好的处理,就常常会在其他地方导致错误。
7.有时候当我们在成功构造或做某事时我们希望在这件事情做完之后某件事情一定发生而在,而在发生异常的时候后续本该做的事情不能发生,如在打开文件时,我们希望在成功打开文件做完操作之后相对应的清理工作一定要执行而在文件打开失败的时候清理工作一定不要发生,那么可以用嵌套的try-catch语句达到这个效果,代码如下:
package com.michael.test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class InputFile {
private BufferedReader in;
public InputFile(String fname) throws Exception{
try{
in = new BufferedReader(new FileReader(fname));
}catch(FileNotFoundException e){
System.out.println("Could not open "+fname);
throw e;
}catch(Exception e){
try{
in.close();
}catch(IOException e2){
System.out.println("in.close failed!");
}
throw e;
}finally{
//Don't close it here!!!
}
}
public String getLine(){
String s;
try{
s = in.readLine();
}catch(IOException e){
throw new RuntimeException("readLine() failed!");
}
return s;
}
public void dispose(){
try{
in.close();
System.out.println("dispose success.");
}catch(IOException e2){
throw new RuntimeException("in.close() failed!");
}
}
}
这个类用于打开一个指定的文件,并将打开的文件流封装成一个对象,以下是测试上面类的方法:
package com.michael.test;
public class Cleanup {
public static void main(String[] args){
try{
InputFile in = new InputFile("Cleanup.java");
try{
String s;
int i = 1;
while((s = in.getLine()) != null)
;//Perform line-by-line here
}catch(Exception e){
System.out.println("Caught exception in main");
e.printStackTrace(System.out);
}finally{
in.dispose();
}
}catch(Exception e){
System.out.println("InputFIle construction failed.");
}
}
}
这里我们注意到在用文件名字符串在构造InputFile对象的时候里面的finally并没有做关闭文件输入流的操作,想想这是为什么?
仔细观察这里的逻辑:对于InputFile对象在自己的try语句块中有效,如果构造失败,将进入外部的catch子句,而dispose()方法不会被调用,但是如果构造成功,我们肯定想确保对象能够被清理,因此构造之后立即创建了一个新的try语句块。执行清理的的finally与内部的try语句块相关联,在这种方式中,finally字句在构造失败时是不会执行的,而在构造成功时将总是执行。
这种通用的清除惯用法在构造器不抛出任何异常时也应该运用,其基本规则是:在创建需要清理的对象之后,立即进入一个try-finally语句块。
8.在任何时候你都应该考虑所有的可能性,并保证正确处理每一种情况。
9.好的程序设计语言能帮助程序员写出好的程序,但无论哪种语言都避免不了程序员用它写出糟糕的程序。
10.根据《think in java》应该在下列情况使用异常:
a.在恰当的级别处理问题(在知道如何处理的情况下才捕获异常)
b.解决问题并重新调用产生异常的方法。
c.进行少许修补然后绕过异常发生的地方继续执行。
d.用别的数据进行计算,以代替方法预计会返回的值。
e.把当前环境下面能做的事情尽量做完,然后把相同(不同)的异常抛到更高层。
f.终止程序。
g.进行简化(如果你的异常模式使问题变得太复杂,那用起来会非常的痛苦且很烦人)
h.让类库和程序更安全(这是在为调试做短期投资,也是在为程序的健壮性做长期的投资)
11.java中的异常处理系统很多时候的功能是‘报告’异常,真正从异常中‘恢复’的情况是很少的,之所以设计异常系统的目的是为了让每一个异常都是被知道的,不管我们有没有从其中恢复到正常状态。
未完待续