异常:是在运行时期发生的不正常情况。在java中用类的形式对不正常情况h进行描述和封装。描述不正常的情况的类,就称为异常类。实质上异常就是Java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述。比如角标越界。空指针等等。问题很多,意味着描述的类也很多。
Throwable:无论是error 还是异常,发生问题的时候就应该可以抛出,m让调用者知道并处理。
可抛性到底指的是什么呢?怎么体现可抛性呢?
其实是通过两个关键字来体现的。
throwsthrow ,凡是可以被这两个关键字所操作的类和对象都具备可抛性.
异常的分类:
1.Error --- 一般不可处理的
特点:是由jvm抛出的严重问题。这种问题一般不做针对性处理,直接修改程序。
2Exception ----- 可以处理的
自定义异常
注意:如果让一个类称为异常类,必须要继承异常体系,因为这样才能具备可抛性。才可以被2个关键字throws和throw处理
1,编译时被检测异常:
只要是Exception和其子类都是,除了特殊子类RuntimeException体系。
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
这样的问题都可以针对性的处理。
2,编译时不检测异常(运行时异常):
就是Exception中的RuntimeException和其子类。
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引 发了内部状态的改变导致的。
那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让 调用者对代码进行修正。
所以自定义异常时,要么继承Exception。
要么继承RuntimeException。
throws 和throw的区别:
1, throws使用在函数上。
throw使用在函数内。
2, throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象。
异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式。
具体格式是:
try
{//需要被检测异常的代码。}
catch(异常类变量)//该变量用于接收发生的异常对象
{//处理异常的代码。}
finally
{//一定会被执行的代码。}
异常处理的原则:
1,函数内容如果抛出需要检测的异常:
--那么函数上必须要声明
--否则必须在函数内用try catch捕捉,否则编译失败。
2,如果调用到了声明异常的函数:要么try catch要么throws,---》否则编译失败。
3,什么时候catch,什么时候throws呢?
功能内容可以解决,用catch。
解决不了,用throws告诉调用者,由调用者解决 。
4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。
5,多个catch,父类的catch放在最下面。
6,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。
7,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相 关的异常。或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,让调用者 知道,并处理。也可以将捕获异常处理后,转换新的异常。
Try{Throw new AException();}
Catch(AException e){
Throw e;}
Try{Throw new AException();}
Catch(AException e){
//对AException处理。
Throw new BException();
}//汇款例子
异常的注意事项:
1, 子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类。(流程可以看出:对象不一致。)
2, 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。(子类异常少于父类异常)
注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try.(可以参想上面,无对象)