异常大约这么用
public void aMethod() throws AException, BException...{
代码块A
try{
代码块B //可能产生异常并且要处理的部分,不处理的可以直接像上面throws出去,交给上面的人处理
}catch(CException c) {
c.printStackTrace(System.out);
throw c;//后续的catch会被忽略
}catch(DException) {//C如果能包含掉D,D就没有意义了,所以前面的异常要不能包含后面的
可以catch多个异常
}finally {//final finally finalize 三个完全不一样 一个表示常态不变、一个用于异常、一个GC
无论是否产生异常均执行,try块执行完或者抛出异常后执行
}
代码块B
}
Throwable分为Error(编译时和系统错误)、Exception
异常Exception的构造器:默认,Exception(String)
异常体制就像社会中有些人被杀害了,尸体被发现,可以进行相应的处理和追溯
自定义异常:extends Exception
catch到之后可以被再次throw 这样的话后续的catch会被忽略
打印错误信息(从上到下 从左到右 每一个都是上一个的超集(打印的东西更多)
String=e.getMessage 、getLocalizedMessage
从祖宗那继承来的
toString (getClass getName getSimpleName)
特殊的打印-打印Throwable和Throwable的调用栈轨迹--打印异常冲出现到终点的人生轨迹
e.printStackTrace();//默认将输出到标准错误流 e.printStackTrace(PrintStream) 、e.printStackTrace(PrintWriter)
所谓的栈轨迹--通过getStackTrace可以得到跟e.printStackTrace()打印一样的数组,数组的0表示栈顶 异常出生的地方
特殊的方法
Throwabel fillInStackTrace() 重新填充栈信息,比如catch之后调用此方法,再throw 则打印栈轨迹的时候此处就是栈顶,不然原来的异常还是原来那样,一般用来掩盖实际的跑尸地点
initCause(Throwable cause) 根据指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包含 cause 的类和详细消息) 构造器根据cause创建只有Error、Exception、RuntimeException支持 打印时候会打印出Cause by
特殊的Exception
RuntimeException,自动被JVM抛出 不用 if(a==null) throw new NullPointerException();若不捕捉,走动调用printStackTrace(System.err)
关于finally
return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果
finally块如果出现异常会覆盖掉原来出现的异常
异常抛出与覆盖(重写)
当覆盖方法时,只能抛出在基类方法的异常说明里列出的那些对象,老子说抛出A 儿子不能抛出更大的
注:catch到异常若当时不知道如何处理,建议先写上throw new RuntimeException(catchException) 或者catchException.printStackTrace() 防止遗忘了处理
异常处理主要是类型关注比较多,其余类似,所以有必要看看常用的异常类