十、异常
1、系统结构图(xmind)
2、tips
——1.throw和throws的区别
1.throws用于标识函数暴露出的异常类,并且可以抛出多个,用逗号分隔。throw用于抛出异常对象。
2.thorws用在函数上,后面跟异常类名。throw用在函数内,后面跟异常对象。
定义功能方法时,需要把出现的问题暴露出来让调用者去处理,那么就通过throws在函数上标识。在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
——2.异常的分类
1.编译时被检测异常:这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式,这样的问题都可以针对性的处理。
2.编译时不被检测异常(运行时异常):这种问题的发生,无法让功能继续,更多是因为调用的原因导致的或者引发了内部状态的改变导致的,这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行调整。所以自定义异常时要么继承Exception,要么继承RuntimeException。
——3.格式与注意事项
RuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类。
可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在throws子句中进行声明。
异常处理的捕捉形式:
可以对异常进行针对性处理的方式。
具体格式是:
try
{
//需要被检测异常的代码。
}
catch(异常类变量)//该变量用于接收发生的异常对象
{
//处理异常的代码。
}
finally
{
//一定会执行的代码;
}
注意事项:
finally代码块只有一种情况不会被执行,就是在之前执行了System.exit(0)。
处理过程:
try中检测到异常会将异常对象传递给catch,catch捕获到异常进行处理。
finally里通常用来关闭资源。比如:数据库资源,IO资源等。
需要注意:try是一个独立的代码块,在其中定义的变量只在该变量块中有效。
如果在try以外继续使用,需要在try外建立引用,在try中对其进行初始化。IO,Socket就会遇到。
/*
老师用电脑:
有两个对象:电脑,老师
其中涉及两个问题:
比如蓝屏,冒烟。
*/
class lanpinException extends Exception
{
lanpinException(String msg)
{
super(msg);
}
}
class maoyanException extends Exception
{
maoyanException(String msg)
{
super(msg);
}
}
class NoplanException extends Exception
{
NoplanException(String msg)
{
super(msg);
}
}
//描述电脑对象,抛出蓝屏和冒烟两个异常。
class computer
{
private int state = 1;//0,2
public void run()throws lanpinException,maoyanException
{
if(state == 1)
throw new lanpinException("电脑蓝屏了");
if(state == 2)
throw new maoyanException("电脑冒烟了");
System.out.println("电脑运行");
}
//重启功能
public void reset()
{
state = 0;
System.out.println("电脑重启");
}
}
//老师对象,使用电脑,当电脑冒烟异常触发时,抛出计划外异常
class teacher
{
private String name;
private computer comp;
//老师这个对象有使用电脑的行为以及老师姓名的属性
teacher(String name)
{
this.name = name;
comp = new computer();
}
//老师有讲课功能,讲课中使用电脑可能出现异常,捕捉
public void prelect()throws NoplanException
{
try
{
comp.run();
System.out.println(name+"讲课");
}
catch (lanpinException e)
{
System.out.println(e.toString());
comp.reset();
prelect();
}
catch (maoyanException e)
{
System.out.println(e.toString());
test();
throw new NoplanException("课时无法进行,原因:"+e.getMessage());
}
}
public void test()
{
System.out.println("大家练习");
}
}
class ExceptionDemo2
{
public static void main(String[] args)
{
//创建老师对象,讲课期间可能出现异常,捕捉
teacher t = new teacher("老师");
try
{
t.prelect();
}
catch (NoplanException e)
{
System.out.println(e.toString()+"...换人");
}
}
}
运行结果: