黑马程序员--自学笔记--异常

异常

-------- android培训java培训、期待与您交流! ---------

一.概述

    异常就是在运行时期发生的不正常情况。在java中用类的形式对不正常情况进行了描述和封装对象。描述不正常的情况的类,就称为异常类。
    异常体系结构:

    Throwable :是java对不正常情况进行描述后产生的对象体系。无论是error,还是异常、问题,问题发生就应该可以抛出,让调用者知道并处理。该体系的特点就在于Throwable及其所有的子类都具有可抛性。
    该体系的不正常情况分成了两大类:
        ① 一般不可处理的:Error
        // 特点:是由jvm抛出的严重性问题。这种问题发生,一般不针对性处理,直接修改程序。
        ② 可以处理的:Exception
    该体系的特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。
注意:
    凡是可以被throws和throw这两个关键字所操作的类和对象都具备可抛性。

二.异常的处理

    对于异常的处理:java提供了特有语句进行处理(即try{}catch{})。
代码演示:
    try{
        需要被检测的代码 ;
    }catch(异常类型 变量){
        处理异常的代码(处理方式) ;
    }finally{
        一定会被执行的语句 ;
    }
注意:
    该处理异常的语句的主要搭配:try-catch、try-catch-finally、try-finally三种形式。
范例演示:
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">public class Demo {</span>
	public static void main(String[] args) {
		int x = 5;
		int y = 0;
		try {
			//由于除数为零,导致异常发生
			int retsult = x / y;
			System.out.println("执行到我说明没有异常^_^");
		} catch (Exception e) {
			System.out.println("发生异常啦T_T");
			e.printStackTrace();
		} finally { // 通常用于关闭(释放)资源
			System.out.println("我一定会被执行");
		}
		System.out.println("执行完成");
	}
}</span><span style="color:#ff9966;">
</span></span></strong></strong></span>

三.自定义异常

1.自定义异常的定义 
    将可以自定义出的问题描述称为自定义异常。
2.自定义异常的条件
    ① 要想让一个类成为异常类,必须要继承异常体系,因为只有成为异常体系的子类才有资格具备可抛性,才可以被两个关键字所操作:throws、throw。
    ② 自定义异常类需要继承Exception或者其子类,通过构造函数定义来异常信息。
3.throws和throw两个关键字的区别:
    throw:在函数内使用,后面跟着异常对象。如RuntimeException。
    throws:可以在函数上声明异常。便于提高代码的安全性,让调用者进行处理,否则编译失败。后面跟着异常类,可以用逗号隔开跟多个异常类。
范例演示:(注意:注释中包含知识点注意点)
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">	public void setGender(String gender) throws MyException { // throws在函数上声明异常</span>
		if (gender.equals("男") || gender.equals("女")) {
			this.gender = gender;
		} else {
			/*
			 * throw可以在方法体内抛出异常,但必须捕获或者 在方法体上用throws抛出
			 */
			throw new MyException("性别只能是男或者女哦!");
		}
	}</span></span></strong></strong></span>

四.异常相关注意事项

1.异常处理的原则
    ① 函数内容如果有抛出需要检测的异常,那么在函数上必须要声明。否则,必须在函数内用try/catch语句进行捕捉,否则将会编译失败;
    ② 如果调用到了声明异常的函数,那么要不就利用try/catch语句进行捕捉,要不就使用关键字throws直接抛出,否则将会编译失败;
    ③ 如果产生异常的功能内容可以通过本身解决,就使用用catch语句。如果解决不了,就需要通过使用throws关键字告诉调用者,由调用者进行解决;
    ④ 一个功能如果抛出了多个不同的异常,那么在调用时,就必须有对应多个catch语句进行针对性地处理。内部产生出几个需要检测的异常,就会抛几个异常,就需要通过catch语句处理几个。
范例演示:
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">class Demo {</span>
	public int show(int index) throws ArrayIndexOutOfBoundsException {
		if (index < 0)
			throw new ArrayIndexOutOfBoundsException("越界啦!");
		int[] arr = new int[4];
		return arr[index];
	}
}

class ExceptionDemo {
	public static void main(String[] args) {
		Demo d = new Demo();
		try {
			int num = d.show(-2);
			System.out.println("num = " + num);
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(e.toString());
			System.exit(0);// 退出jvm
		} finally { // 通常用于关闭(释放)资源
			System.out.println("finally"); // 由于前面执行了System.exit(0);,故不会执行此语句。
		}
		System.out.println("over");
	}
}</span></span></strong></strong></span>

2.异常的注意事项
    ① RuntimeException以及其子类异常如果在函数中被关键字throw抛出,则可以不用在函数上进行声明;
    ② 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类;如果父类抛出了多个异常,那么子类只能抛出父类异常的子集;总而言之,子类覆盖父类只能抛出父类的异常或者子类的子集。(该注意点必须记住,在今后代码开发必须要留心)
    ③ 如果父类的方法没有抛出任何异常,那么子类覆盖时绝对不能抛出异常,只能通过try/catch语句进行处理。

五.异常综合案例

通过以下关于异常的代码演示,进一步认识异常的相关知识:  (注意:注释中包含知识点和注意点)
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">class FuShuException extends Exception// 自定义的异常类</span>
{
	private int value;

	FuShuException(String mes, int value) {
		/*
		 * 因为自定义异常继承于Exception,而且Exception再 继承Throwable的时候就已经复写了它的方法,所以可以直接引用
		 */
		super(mes);
		this.value = value;
	}

	public int getValue() {
		return value;
	}
}

class Demo {
	// 函数内抛出异常时,函数上应声明该异常
	public int div(int a, int b) throws FuShuException {
		if (b < 0)
			// 如果除数是负数,则抛出自定义异常
			throw new FuShuException("负数异常!出现负数了!", b);
		return a / b;
	}
}

class DemoExceptionTest {
	public static void main(String[] args) {
		Demo d = new Demo();
		try {
			int x = d.div(4, -1);
			System.out.println(x);
		} catch (FuShuException e) {
			System.out.println(e.toString());// 打印对自定义异常的描述
			System.out.println("错误的负数时:" + e.getValue());
		}
	}
}</span>
</span></strong></strong></span>








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值