java的基本理念是:结构不佳的代码不能运行。
1。异常情形是指发生阻止当前方法或者作用域继续执行的问题。但抛出异常后,java先使用new再堆上
创建一个异常对象的引用,然后当前执行路径被终止,并且从当前环境中弹出堆异常对象的引用。此时,
异常机制接管程序,并在异常处理程序中继续执行。
2。java所有的标准异常都有两个构造器,一个缺省,一个接受字符串。异常根类为Throwable,
Error,Exception继承此类。
3。捕获所有异常可以使用catch(Excetion e){....}.它从Throwable继承的方法有;
String getMessage(); //返回消息字符串
String getLoacalMessage() //此 throwable 的本地化描述。
String toString() //返回Throwable的简单描述。
void printStackTrace();
void printStackTrace(PrintSteam);
void printStackTrace(java.io.PrintWriter);
Throwable fillStackTrace() ; //用于Throwable的内部记录栈帧的当前状态。在重新抛出异常是用。
4。异常处理中可以重新抛出异常,异常抛给上一级环境处理,同一个try语句的catch子句都回忽略。
5。捕获一个异常后抛出另一个异常,形成异常链。在Throwable的子类种,只有三种异常类提供了cause
参数的构造器,他们是:Error ,Exception以及RuntimeExcepion.如果要把其他类型的异常连接起来,
应该使用initCause()方法。
6。如果对null引用,java会自动抛出NullPointerException异常。不需要:
if (t == null )
throw new NullPointerException() ;
运行时异常不需要在异常说明中把他们列出来。
7。java比c++的异常添加了finally关键字,表示无论如何都会执行。语法:
try(){
}
catch(){
}
.....
finally(){
}
java自动回收内存,finally所做的工作一般使关闭文件,网络连接等等。在finally中抛出异常,导致原来的异常
丢失。
8。java依catch次序捕获异常,而且可以按"向上转型形式"捕获,所以可以用catch(Exception e) 来捕获所有异常。
9。覆盖方法时,只能抛出基类方法的异常说明列表的那些异常,或者不抛出异常。即:抛出异常只能缩小,不能
被放大。但是,继承中,在构造器中可以扩展异常。
10。异常处理的一个重要原则是"只有你知道如何处理的情况下才捕获异常"。否则就会导致"吞食则有害"的问题,导致
异常丢失。有时候把异常传递给控制台,不用try.catch。或者把被检查的异常转化为不检测的异常。例如:
try{
//...to do something useful
}catch(IDnotKnowWhatToDoException e){
throw new RuntimeException(e)
}