08 第八章 异常.docx

上传人:b****7 文档编号:10215576 上传时间:2023-02-09 格式:DOCX 页数:11 大小:58.76KB
下载 相关 举报
08 第八章 异常.docx_第1页
第1页 / 共11页
08 第八章 异常.docx_第2页
第2页 / 共11页
08 第八章 异常.docx_第3页
第3页 / 共11页
08 第八章 异常.docx_第4页
第4页 / 共11页
08 第八章 异常.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

08 第八章 异常.docx

《08 第八章 异常.docx》由会员分享,可在线阅读,更多相关《08 第八章 异常.docx(11页珍藏版)》请在冰豆网上搜索。

08 第八章 异常.docx

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,否则产生异常。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1