首页 > 代码库 > 异常机制
异常机制
1 异常概述
异常:是运行时期放生的不正常情况
在java中用类的形式对不正常情况进行了描述和封装。
描述不正常情况的类 称为异常类
以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性。
其实异常就是java通过面向对象的思想将问题封装成了对象
用异常类对其进行了描述。
不同问题用不同类进行描述。比如角标越界 空指针等等
2异常体系
问题很多,意味着描述的类很多
将其共性进行向上抽取,形成了异常体系。
最终问题分成了两大类。
Throwable 无论是错误还是异常,问题发生就可以抛出,让调用者知道并处理
该体系的特点就在于Throwable及其所有的子类都具有可抛性。
可抛性指的是什么?怎么体现可抛性呢?
其实是通过两个关键字体现的。
Throws throw ,凡是可以被这两个关键字所操作的类和对象具备可抛性。
---1 - 一般不可以处理的 Error
特点:是由jvm抛出的严重性问题
这种问题 发生一般不针对性处理,直接修改程序
----2 可以处理的 Exception
该体系的特点在于子类的后缀名都是用其父类名作为后缀,阅读性很强。
3 自定义异常的抛出
如果某种异常在java体系中未定义 让一个类称为异常类,就必须继承异常体系,这样才具备可抛性。
Class MyException extends Exception
{
MyException()
{
}
MyException(String msg)
{
Super(msg);
}
}
4 编译时被检测异常和运行时异常
编译时被检测异常 只要是Exception和其子类,除了RuntimeException
这种问题一旦出现,希望在编译时就被检测,让这种问题有对应的处理方式
这样的问题都可以针对性处理。以保证程序继续运行
运行时异常 :RuntimeException (编译时不检测)
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用的原因导致或者引发了内部问题的改变导致的。这种问题让其编译通过
5异常捕捉 try catch
异常处理的比浊形式
这是可以对异常进行针对性处理的方式
具体格式是
Try
{
需要被检测异常的代码
}
Catch{异常引用} //该变量用于接收发生的异常对象
{
处理异常的代码
}
Finally
{
}
6多catch
7异常组合
1 try catch finally
2try catch1 catch1
3try finally(异常抛出去,不在这里处理)
8 异常例子
package ExceptionDemo;
/*
* 老师用电脑上课
*
* 问题领域中涉及两个对象 老师和电脑
*
* 分析其中的问题 比如电脑蓝屏 冒烟 (异常的转换)
*
*/
class NoPlanException extends Exception
{
NoPlanException(String msg)
{
super(msg);
}
}
class LanPingException extends Exception
{
public LanPingException(String msg) {
super(msg);
}
}
class MaoYanException extends Exception
{
public MaoYanException(String msg) {
super(msg);
}
}
class Computer
{
private int state=2; //电脑状态
public void run() throws MaoYanException, LanPingException
{
if(state==1)
throw new LanPingException("电脑蓝屏啦");
if(state==2)
throw new MaoYanException("电脑冒烟了");
System.out.println("computer run");
}
public void reset()
{
this.state=0;
System.out.println("电脑重启");
}
}
class Teacher
{
private String name;
private Computer comp;
Teacher(String name)
{
this.name=name;
comp=new Computer();
}
public void test()
{
System.out.println("做练习");
}
public void prelect() throws MaoYanException, NoPlanException
{
try {
comp.run();
System.out.println("老师讲课");
} catch (MaoYanException e) {
System.out.println(e.toString());
test(); //可以对电脑进行维修
throw new NoPlanException("课时进度无法完成,原因:"+e.toString());
} catch (LanPingException e) {
System.out.println(e.toString());
comp.reset();
prelect();
}
}
}
class ExceptionTest
{
public static void main(String[] args) {
Teacher t=new Teacher("a老师");
try {
t.prelect();
} catch (MaoYanException e) {
System.out.println("....");
}
catch(NoPlanException e)
{
System.out.println(e.toString()+".....");
System.out.println("换人");
}
}
}
9 异常注意事项
1 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类
2 如果父类抛出多个异常,那么子类只能抛出父类异常的子集
3 如果父类的方法法没有抛出的异常,那么子类覆盖时绝对不能抛
异常机制