08 第八章 异常.docx
《08 第八章 异常.docx》由会员分享,可在线阅读,更多相关《08 第八章 异常.docx(11页珍藏版)》请在冰豆网上搜索。
08第八章异常
第八章:
异常
学习目标
⏹异常的概念
⏹使用try,catch,和finally指令
⏹异常的分类
⏹公共异常
⏹自定义异常
⏹方法覆盖和异常
什么是异常
在Java编程语言中,异常类定义程序中可能遇到的轻微的错误条件。
你可以写代码来处理异常,并继续执行程序,而不需要让程序中止。
在程序执行中,任何中断正常程序流程的条件都是异常。
例如,发生下列情况时,会出现异常:
想打开的文件不存在
网络连接中断
操作数超出预定范围
非常感兴趣地正在装载的类文件丢失
在Java编程语言中,错误类定义被认为是不能恢复的严重错误条件。
在大多数情况下,当遇到这样的错误时,建议让程序中断。
Java编程语言实现C++异常来帮助建立弹性代码。
在程序中发生错误时,发现错误的方法能抛出一个异常到其调用程序,发出已经发生问题的信号。
然后,调用方法捕获抛出的异常,在可能时,再恢复回来。
这个方案给程序员一个写处理程序的选择,来处理异常。
通过浏览API,可以决定方法抛出的是什么样的异常。
异常的分类
在Java编程语言中,异常有三种分类。
java.lang.Throwable类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。
在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。
它有Error和Exception两个基本子类。
Throwable类不能使用,而使用子类异常中的一个来描述任何特殊异常。
每个异常的目的描述如图:
Error表示恢复不是不可能但很困难的情况下的一种严重问题。
比如说内存溢出。
不可能指望程序能处理这样的情况。
RuntimeException表示一种设计或实现问题。
也就是说,它表示如果程序运行正常,从不会发生的情况。
比如,如果数组索引扩展不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出。
比如,这也适用于取消引用一个空值对象变量。
因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。
这会导致一个运行时信息,应确保能采取措施更正问题,而不是将它藏到谁也不注意的地方。
其它异常表示一种运行时的困难,它通常由环境效果引起,可以进行处理。
例子包括文件未找到或无效URL异常(用户打了一个错误的URL),如果用户误打了什么东西,两者都容易出现。
这两者都可能因为用户错误而出现,这就鼓励程序员去处理它们。
公共异常
Java编程语言提供几种预定义的异常。
下面是可能遇到的更具共同性的异常中的几种:
ArithmeticException:
整数被0除,运算得出的结果。
inti=12/0;
NullPointerException:
当对象没被实例化时,访问对象的属性或方法的尝试:
Dated=null;
System.out.println(d.toString());
NegativeArraySizeException:
创建带负维数大小的数组的尝试。
ArrayIndexoutofBoundsException:
访问超过数组大小范围的一个元素的尝试。
SecurityException:
典型地被抛出到浏览器中,SecurityManager类将抛出applets的一个异常,该异常企图做下述工作(除非明显地得到允许):
访问一个本地文件
打开主机的一个socket,这个主机与服务于applet的主机不是同一个。
在运行时环境中执行另一个程序
异常的处理机制
一般来说,异常的处理机制有以下三种:
try-catch-finally主动异常处理
throws消极异常处理
throw引入异常
实例分析
例1
问题的描述:
写一个常见的异常
解决方案:
请看下例:
publicclassTestException{
publicstaticvoidmain(Stringargs[]){
inti=0;
Stringss[]={"Helloworld!
","您好,世界!
","HELLOWORLD!
!
"};
for(;i<6;i++){
System.out.println(ss[i]);
}
}
}
运行的结果为如图。
要处理异常,将能够抛出异常的代码放入try块中,然后创建相应的catch块的列表,每个可能被抛出异常都有一个。
如果生成的异常与catch中提到的相匹配,那么catch条件的块语句就被执行。
在try块之后,可能有许多catch块,每一个都处理不同的异常。
请看下例:
classTestException2{
publicstaticvoidmain(Stringargs[]){
inti=0;
Stringss[]={"Helloworld!
","您好,世界!
","HELLOWORLD!
!
"};
for(;i<5;i++){
try{
System.out.println("第"+(i+1)+"次循环:
");
System.out.println(ss[i]);
}catch(Exceptione){
System.out.println("数组越界");
}finally{
System.out.println("finallyexecute");
}
}
}
}
运行的结果如图
总结:
从上例可以看出:
不管出现不出现异常,finally语句块都会执行。
在try语句块里除了System.exit(int)语句外,finally语句块必须执行。
Throws则是自己不处理异常,而交给上级处理,俗称“异常上抛”,比如:
publicstaticvoidmain(Stringargs)throwsRuntimeException
这样,一旦在代码里出现RuntimeException,在本类里不做任何处理动作,而是交由上次程序或者虚拟机去处理。
自定义异常
用户定义异常是通过扩展Exception类来创建的。
这种异常类可以包含一个"普通"类所包含的任何东西。
下面就是一个用户定义异常类例子,它包含一个构造函数、几个变量以及方法
请看下例:
classTestMyException{
publicstaticvoidmain(String[]args){
ABCabc=newABD();//ABD是ABC的子类
try{
abc.a(5);
}catch(EAe){
e.test();
}
}
}
创建自己的运行时异常,如果改成Exception,就是创建编译时的异常了,编译的时候就应该对异常处理。
classEAextendsRuntimeException{
Strings;
publicEA(Strings){
this.s=s;
}
publicEA(){
}
publicvoidtest(){
System.out.println(s);
}
};
classEA1extendsEA//创建自己的异常的子异常
{
publicEA1(Strings){
super(s);
}
};
classEA2extendsEA//创建自己的异常的子异常
{
publicEA2(Strings){
super(s);
}
};
classABC{
publicvoida(inti){
if(i<0)
System.out.println("normal");
else
thrownewEA("nonormal");
}
};
classABDextendsABC{
publicvoida(inti){
if(i<0)
System.out.println("dfsdafds");
elseif(i==0)
thrownewEA1("参数==0");
else
thrownewEA2("参数>0");
}
};
运行的结果为:
参数>0
方法覆盖和异常
方法覆盖要注意两点:
⏹访问权限不能比父类的弱
⏹抛出的异常不能比父类的多。
(注意多并不是数量上的多,而是父类方法抛出的异常必须包含子类覆盖方法抛出的异常)
请看下例:
classTestMyException2{
publicstaticvoidmain(String[]args){
ABCabc=newABD();
try{
abc.a(5);
}catch(EAe){
e.test();
}
}
}
classEAextendsException//创建自己的编译时异常
{
Strings;
publicEA(Strings){
this.s=s;
}
publicEA(){
}
publicvoidtest(){
System.out.println(s);
}
};
classEA1extendsEA//创建自己的异常的子异常
{
publicEA1(Strings){
super(s);
}
};
classEA2extendsEA//创建自己的异常的子异常
{
publicEA2(Strings){
super(s);
}
};
classABC{
publicvoida(inti)throwsEA{
if(i<0)
System.out.println("normal");
else
thrownewEA("nonormal");
}
};
classABDextendsABC{
publicvoida(inti)throwsEA1,EA2//虽然抛出的异常比父类多,但是都是父类异常的子类
{
if(i<0)
System.out.println("dfsdafds");
elseif(i==0)
thrownewEA1("参数==0");
else
thrownewEA2("参数>0");
}
};
运行结果为:
参数>0
内容总结
⏹了解java异常的处理机制
⏹掌握java异常的分类
⏹使用try,catch,finnaly对异常进行处理
⏹创建并使用自己定义异常
独立实践
⏹给客户建立一个帐户,当取的钱大于余额的话,就要抛出异常------显示余额不足的信息
⏹编写User类,其年龄必须在18-60,否则产生异常。