java异常类
java.lang.Throwable
方法:
getMessage(); 获得异常描述
printStackTrance(); 打印异常堆栈
两个子类:
Error:仅靠程序本身无法恢复的严重错误,比如内存不足,java虚拟机的方法调用堆栈溢出。
大多数情况下,遇到这样的错误时,程序只有死的份。
StackOverError,OutOfMemoryError
Exception:表示程序可以处理的异常。程序出现异常的时候,应该尽可能地处理异常,并且
使得程序恢复运行,而不应该随意中止。
EOFException,FileNotFoundException
RuntimeException异常及其子类:运行时异常
java编译器不会检查它,这种异常没有try catch语句捕获,也没有throw字句抛出,还是编译通过。
unchecked Exception
运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现错误操作,建议
终止程序,因此java编译器不检查这种异常。
运行时异常应该尽量避免,在程序调试阶段,遇到这种异常的时候,正确的做法是改进程序的设计和实现方式,修改程序
中的错误,从而避免这种错误。
如果捕获并且使程序恢复运行不是明智的行为:
1.这种异常一旦发生,损失严重。
2.即使程序恢复运行,也可能会导致程序的业务逻辑错乱,甚至导致更严重的异常,或者得到错误的运行结果。
受检异常,除了RuntimeException及其子类的所有Exception及其子类。
Checked Exception
这种异常要么用try..catch捕获,要么用throw子句声明抛出,否则编译不会通过。
可以处理和修复的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理,如此递推,知道在某一层可以处理它,
就进行必要的处理,而不至于终止程序。
Error和java运行时异常:
相同:java编译器都不会检查他们,当程序出现错误的时候,都死。
不同:Error及其子类是由java虚拟机抛出,一般不可拓展。
RuntimeException表示程序代码中的错误,可以自定义。
异常转义和异常链
异常处理原则
1.异常只能用于非正常情况
2.为异常提供文档说明
3.尽可能地避免异常
**许多运行时异常是由于代码中的错误引起的,修改代码,改进实现方式
**提供状态测试方法,某种状态下,不适合这种操作,引起异常。
4.保持异常的原则性
**检查方法的参数是否有效,确保异常发生的时候还没有改变初始状态
**恢复代码
**在对象的临时对象上进行操作,当操作成功后,把拷贝的内容复制到原来的对象上
5.避免过于庞大的try代码块
**分段处理
6.在catch子句中指定具体的异常
try{
//code
}catch(Exception e){//code}
**俗话说对症下药,对不同的异常通常有不同的处理方式。以上代码意味着对所有异常采用相同的方式,这往往是不现实的。
**会捕获本来应该抛出的运行时异常,掩盖程序中的错误。
7.不要在catch代码块中忽略被捕获的异常
**处理异常:针对异常采取一些行动,比如弥补造成的损失或者给出警告。
**重新抛出异常:如果当前时间或者环境下还不能处理该异常,就应该重新抛出。
**进行异常转译:把原始异常包装成适合当前抽象层的另一种异常,再将其抛出。
**假如在catch代码块中不能采取任何措施,那么就不要捕获异常,而是用throws子句声明抛出异常。