Java的基本理念是“结构不佳的代码不能运行”(被检查的异常)
1.概念
早期语言常常具有多种错误处理模式,这些模式是通过在约定俗成的基础上。
在Java中,用强制规定的形式来消除错误处理过程中随心所欲的因素。(即为:我写的程序会报错,但是别人造成的。和我没关系)
2.基本异常
主要分类:运行时异常和编译时异常。如果能拆能在编译时处理掉,那就真的再好不过了
3.捕获时异常
理解
监控区域(guarded region)的概念,它是一点可能产生异常的代码,并且后面跟着处理这些异常的代码。
try 快
捕获异常就想当于一个"
事务",一旦抛出异常,事务回滚
4.创建自定义异常(继承Exception)
5.异常链
有时我们在处理异常的时又会抛出异常。此时要考虑用异常链(
说白了就是组合。一个异常组合在另一个异常的构造方法中)
package com.myboy.exceptiondemo;
class e1 extends Exception{
}
class e2 extends Exception{
e2(Throwable cause){
super(cause);
}
}
class A{
public void f() throws e2{
try {
g();
} catch (e1 e) {
e.printStackTrace();//异常链
throw new e2(e);//组合
}
}
public void g() throws e1{
throw new e1();
}
}
public class Test1 {
public static void main(String[] args) {
A a=new A();
try {
a.f();
} catch (e2 e) {
e.printStackTrace();
}
}
}
6.Java标准异常
Throwable这个Java类被用来表示任何可以作为异常被抛出的类(基类)
Error和Exception是Throwable的导出类,此处异常理解就可
7.使用finally进行清理
无论try块中异常是否抛出,它们都能得到执行。
在return 中使用finally:在return中,一定会先执行finally块中的代码
package com.myboy.exceptiondemo;
class MuitpleReturns {
public static String f(int i) {
try {
if(i==1) return null ;
} finally {
System.out.println("zhulu");
}
return "aa";
}
}
public class Test2 {
public static void main(String[] args) {
for(int i=1;i<2;i++){
MuitpleReturns.f(i);
}
}
}//out zhulu
异常缺失:缺少最重要的异常,在特殊处理finally 里面,可能会直接忽略到某个异常
package com.myboy.exceptiondemo;
class A extends Exception {
@Override
public String toString() {
return "A Level Exceptoin";
}
}
class B extends Exception {
@Override
public String toString() {
return "B Level Exception";
}
}
class Demo {
public void demo1() throws A {
throw new A();
}
public void demo2() throws B {
throw new B();
}
}
public class Test3 {
public static void main(String[] args) {
try {
Demo demo = new Demo();
try {
demo.demo1();
// } catch (A e) {
// e.printStackTrace();//请问谁不会打印信息,那真是Low到爆了
} finally {
demo.demo2();
}
} catch (Exception e) {
// e.printStackTrace();
System.out.println(e.toString());
}
}
}
6.异常匹配
抛出异常的时候,异常处理系统会按照代码的
书写顺序找出"最近"的处理程序。找到匹配的处理程序后,它就认为异常的大盘了处理,就不再继续查找。
注:
在多个catch 中,异常的基类大小一定要有顺序,不然虽然会抛出异常,但是不会抛出具体异常信息。
7.其他处理方式
所有尝试丢失掉异常信息的代码都是有问题的代码,要承认这不是设计问题,就是垃圾代码。