第十二章:通过异常来处理错误

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.其他处理方式

所有尝试丢失掉异常信息的代码都是有问题的代码,要承认这不是设计问题,就是垃圾代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值