java程序错误类型及异常处理Word文档格式.docx

上传人:b****4 文档编号:18030229 上传时间:2022-12-13 格式:DOCX 页数:17 大小:30KB
下载 相关 举报
java程序错误类型及异常处理Word文档格式.docx_第1页
第1页 / 共17页
java程序错误类型及异常处理Word文档格式.docx_第2页
第2页 / 共17页
java程序错误类型及异常处理Word文档格式.docx_第3页
第3页 / 共17页
java程序错误类型及异常处理Word文档格式.docx_第4页
第4页 / 共17页
java程序错误类型及异常处理Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

java程序错误类型及异常处理Word文档格式.docx

《java程序错误类型及异常处理Word文档格式.docx》由会员分享,可在线阅读,更多相关《java程序错误类型及异常处理Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

java程序错误类型及异常处理Word文档格式.docx

、数组下标越界、文件打不开、磁盘空间不够、数据库连接错误等。

此类错误发生时,编译平台一般也会提示相应的信息,对于常规的错误会有比较精确地提示,但有时提示的错误原因会比较模糊,但因为此类错误一般在程序运行时,只在特定的条件下才会发生,所以根据错误发生的条件,能够大致判断程序出错的代码段,结合错误的原因,也能比较方便的调试出错误。

3、逻辑错误

程序运行后,没有得到设计者预期的结果,这就说明程序存在逻辑错误。

这种错误在语法上是有效的,但是在逻辑上是错误的。

程序运行了,也没有出错,但是执行出来的结果不是用户想要的,分为两种情况:

A、 

能够看出错误:

比如查询工资大于5000的人员名单,却出现了3000的;

B、 

看不出错误,直到因缘际会发现程序肯定出错了,后果很严重:

比如进行一个符合大型运算,把某个常数输入错了,最后的结果人工无法判断对错,又以该结果进行其它的运算等等,最后发现错了误差过大,就得从头排查错误。

例如:

使用了不正确的变量,指令的次序错误,循环的条件不正确,程序设计的算法考虑不周全等。

通常,逻辑错误也会附带产生运行错误。

在一般情况下,编译器在编译程序时,不能检测到程序中的逻辑错误,也不会产生逻辑错误的提示,因此逻辑错误比较难排除,需要程序员仔细的分析程序,并借助集成开发环境提供的调试工具,才能找到出错的原因,并排除错误。

二、java的异常处理(错误处理)

程序的错误就是通常的异常,也叫Exception。

对于语法错误,java编译系统在编就能发现检查出错误。

对于逻辑错误,编译系统是无法发现错误的,错误需要人为去发现排除错误。

对于运行错误,Java语言中代表异常时,使用一个专门的类来代表一种特定的异常情况,在系统中传递的异常情况就是该类的对象,所有代表异常的类组成的体系就是Java语言中的异常类体系。

1、java异常类

Java的异常是一个对象,所有的异常都直接或间接地继承Throwable类。

Throwable类的继承层次结构如下:

为了方便对于这些可传递对象的管理,JavaAPI中专门设计了java.lang.Throwable类,只有该类子类的对象才可以在系统的异常传递体系中进行。

该类的两个子类分别是:

1)Error类 

该类代表错误,指程序无法恢复的异常情况。

对于所有错误类型以及其子类,都不要求程序进行处理。

常见的Error类例如内存溢出StackOverflowError等。

2)Exception类 

该类代表异常,指程序有可能恢复的异常情况。

该类就是整个Java语言异常类体系中的父类。

使用该类,可以代表所有异常的情况。

在JavaAPI中,声明了几百个Exception的子类分别来代表各种各样的常见异常情况,这些类根据需要代表的情况位于不同的包中,这些类的类名均以Exception作为类名的后缀。

如果遇到的异常情况,JavaAPI中没有对应的异常类进行代表,也可以声明新的异常类来代表特定的情况。

在这些异常类中,根据是否是程序自身导致的异常,将所有的异常类分为两种:

a) 

RuntimeException及其所有子类 

该类异常属于程序运行时异常,也就是由于程序自身的问题导致产生的异常,例如数组下标越界异常ArrayIndexOutOfBoundsException等。

该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现语法错误。

b) 

其它Exception子类 

该类异常属于程序外部的问题引起的异常,也就是由于程序运行时某些外部问题导致产生的异常,例如文件不存在异常FileNotFoundException等。

该类异常在语法上强制程序员必须进行处理,如果不进行处理则会出现语法错误。

熟悉异常类的分类,将有助于后续语法中的处理,也使得在使用异常类时可以选择恰当的异常类类型。

2、常见的error类

异常类名

用途

LinkageError

动态链接失败

VirtualMachineError

虚拟机错误

AWTError

AWT错误

3、常见运行时异常类

ArithmeticException

数学运算异常,比如除数为零的异常

IndexOutOfBoundsException

下标越界异常,比如集合、数组等

ArrayIndexOutOfBoundsException

访问数组元素的下标越界异常

StringIndexOutOfBoundsException

字符串下标越界异常

ClassCaseException

类强制转换异常

NullpointerException

当程序试图访问一个空数组中的元素,或访问一个空对象中的方法或变量时产生的异常。

4、常用的非运行时异常

ClassNotFoundException

指定类或接口不存在的异常

IllegalAccessException

非法访问异常

Ioexception

输入输出异常

FileNotFoundException

找不到指定文件的异常

ProtocolException

网络协议异常

SocketException

Socket操作异常

MalformedURLException

统一资源定位符(URL)的格式不正确的异常

5、Java的异常处理机制描述如下:

在一个方法的运行过程中,如果发生了异常,

则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。

我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。

运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往前寻找,直到找到包含相应异常处理的方法为止。

其过程如图10-1所示。

这一过程称为捕获(catch)一个异常。

如该异常未进行成功捕获,则程序将终止运行。

5、异常捕获和处理

格式:

try{

正常程序段,可能抛出异常;

}

catch(异常类1 

异常变量){

捕捉异常类1有关的处理程序段;

catch(异常类2 

捕捉异常类2有关的处理程序段;

……

finally{

一定会运行的程序代码;

try块——捕获异常:

用于监控可能发生异常的程序代码块是否发生异常,如果发生异常,Try代码块将抛出异常类所产生的对象并立刻结束执行,而转向异常处理catch部分。

对于系统产生的异常或程序块中未用try监控所产生的一场,将一律由java编译系统自动将异常对象抛出。

catch块——处理异常:

抛出的异常对象如果属于catch内所定义的异常类,则catch会捕获该异常,并进入catch中的对应代码段继续运行程序,如果异常对象不属于catch中所定义的异常类,则进入finally块继续运行程序。

Catch包括两个参数:

一个是类名,指出捕获的异常类型,必须使Throwable类的子类;

一个是参数名,用来引用被捕获的对象。

Catch块所捕获的对象并不需要与它的参数类型精确匹配,它可以捕获参数中指出的异常类的对象及其所有子类的对象

finally块——最终处理:

无论是否发生异常都会执行的语句块。

比如执行关闭打开的文件、删除临时文件,关闭数据库连接等操作。

注意:

一个try、catch、finally块之间不能插入任何其它代码

catch可以有多个,try和finally只能有一个

try后面必须要跟catch、finally其中的一个,即但一个try、catch、finally语句只能省略catch、finally中的一个。

定义多个catch可精确地定位java异常。

如果为子类的异常定义了特殊的catch块,而父类的异常则放在另外一个catch块中,此时,必须满足以下规则:

子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。

所以,越特殊的异常越在前面处理,越普遍的异常越在后面处理。

这类似于制订防火墙的规则次序:

较特殊的规则在前,较普通的规则在后。

异常类常用方法

常用非法

VoidStringgetMessage()

返回异常对象的一个简短描述

VoidStringtoString()

获取异常对象的详细信息

VoidprintStackTrace()

在控制台上打印异常对象和它的追踪信息

6、异常实例

1) 

数学运算异常

classMathException{

publicstaticvoidmain(String 

args[]){

inta=5,b=0;

intc=a/b;

//除数为0,出现异常

System.out.print(c);

}

在命令提示符下运行该程序,可以发现编译正常,但是执行时出现错误的提示如下:

Exceptioninthread"

main"

java.lang.ArithmeticException:

/byzero

atMathException.main(MathException.java:

4)

翻译过来就是:

在类java.lang.ArithmeticException主线程中“main”方法中出现异常:

除数为零,(MathException.java:

4“此处指MathException类中的第四行”)

这是一个典型的运行错误,程序告诉了一下几个信息;

出错的异常类:

java.lang.ArithmeticException

出错的类:

MathException

出错的代码:

MathException.java:

4

因为编译系统给出了出错的原因和出错类的位置,可以方便地进行代码调试。

2)捕获数学运算异常的处理

publicclassTryCatchDemo{

publicstaticvoidmain(Stringargs[]){

try{

inta=8,b=0;

intc=a/b;

System.out.print(c);

//ArithmeticException是异常类的名称,e是引用的参数名称

catch(ArithmeticExceptione){

System.out.println("

发生的异常简短描述是:

"

+e.getMessage());

发生的异常详细信息是:

+e.toString());

程序执行结果:

/byzero

java.lang.ArithmeticException:

3)数组下标越界异常

publicclassarrayException{

publicstaticvoidmain(String[]args){

//被监视的代码块

try{

int[]a=newint[4];

a[4]=9;

//处理下标越界异常

catch(ArrayIndexOutOfBoundsExceptionaiobe){

这里出现的错误类型是:

数组下标越界!

);

//处理空引用异常

catch(NullPointerExceptionnpe){

空引用!

}

finally{

程序无条件执行该语句!

三、异常的抛出

异常的抛出可以分为两大类:

系统自动抛出异常

比如上面的例子就是系统自动抛出异常,通过trycatch捕获异常对象,并继续相应的处理。

通过关键字throw将异常对象显性地抛出。

即在程序中生成自己的异常对象,即异常可以不是出错产生,而是人为编写代码主动抛出。

显性抛出异常从某种程度上实现了将处理异常的代码从正常流程代码中分离开了,使得程序的主线保证相对完整,同时增加了程序的可读性和可维护性。

异常沿着调用层次向上抛出,交由调用它的方法来处理。

为什么要在方法中抛出异常?

系统自动抛出异常一般就能解决大部分问题,但有时候,程序会产生特定的要求,需要由用户自己定义异常信息,又或者联合开发程序模块时,不同程序员需要将各自负责代码部分尽量避免因程序出错影响其他人的编码,都需要显式抛出异常,以便程序进行处理。

这时候就需要在方法中抛出异常。

异常抛出的语法:

throw 

new 

异常类();

其中异常类必须Throwable类及其子类。

比如:

thrownewThrowableObject();

ArithmeticException 

e=newArithmeticException();

throwe;

throws子句的方法声明的一般格式如下:

<

类型说明>

方法名(参数列表) 

throws 

<

异常类型列表>

{

方法体;

举例:

classThrowException{

//throwOne方法后用throws声明异常类ArithmeticException

staticvoidthrowOne(inti)throwsArithmeticException{

if(i==0)

thrownewArithmeticException("

i值为零"

//用throw抛出一个异常

//捕获异常

throwOne(0);

catch(ArithmeticExceptione){

已捕获到异常错误:

"

i值为零

例:

importjava.io.*;

classFather{

//父类方法,没有抛出异常

publicvoidmyFunction(){

这里是父类方法,该方法没有异常抛出!

classSonextendsFather{

//子类重写父类方法,有捕获异常抛出

publicvoidmyFunction()throwsInterruptedException{

这里是子类方法,该方法抛出InterruptedException异常!

publicclassTestExceptionDemo{

//创建子类对象

Sons=newSon();

//受监视的代码

try{

s.myFunction();

//异常处理代码

catch(InterruptedExceptione){

e.printStackTrace();

重新抛出异常对象

程序执行时,要求用户从键盘输入一个字符号。

当输入‘0’时,程序执行结果:

devidedby0;

当输入非‘0’字符时,程序执行运算出的结果。

classJavaThrows{

publicint 

compute(intx)throws 

ArithmeticException

{

intz=10/x;

//可能抛出异常类型ArithmeticException的对象

returnz;

publicvoidmethod1()

intx;

x=System.in.read();

//可能抛出异常类型IOException的对象;

x=x-48;

x=compute(x);

//抛出异常类型ArithmeticException的对象

System.out.println(x);

catch(IOExceptionioe){ 

//捕获异常类型IOException的对象;

readerror"

catch(ArithmeticExceptione){ 

//捕获异常类型ArithmeticException的对象

devidedby0"

publicstaticvoidmain(Stringargs[]){

JavaThrowst1=newJavaThrows();

t1.method1();

四、自定义异常

用户自定义的异常类,只需继承一个已有的异常类就可以了,包括继承Execption类及其子类,或者继承已自定义好的异常类。

如果没有特别说明,可以直接用Execption类作为父类。

自定义类的格式如下:

class 

异常类名extends 

Exception

……

自定义异常类必须继承自Throwable或Exception类,建议用Exception类。

一般不把自定义异常作为Error的子类,因为Error通常被用来表示系统内部的严重故障。

当自定义异常是从RuntimeException及其子类继承而来时,该自定义异常是运行时异常,程序中可以不捕获和处理它。

当自定义异常是从Throwable、Exception及其子类继承而来时,该自定义异常是编译时异常,也即程序中必须捕获并处理它。

使用自定义异常的步骤如下:

首先通过继承java.lang.Exception类声明自定义的异常类。

在方法的声明部分用throws语句声明该方法可能抛出的异常。

在方法体的适当位置创建自定义异常类的对象,并用throw语句将异常抛出。

调用该方法时对可能产生的异常进行捕获,并处理异常。

自定义一个异常类,输入一个数,大于10,捕获异常。

//MyExceptionDemo.java

classMyExceptionextendsException{//继承了Exception这个父类

privateintdetail;

MyException(inta){

detail=a;

publicStringtoString(){

return"

MyException["

+detail+"

]"

;

classMyExceptionDemo{

staticvoidcompute(inta)throwsMyException{

调用compute("

+a+"

)"

if(a>

10){//a大于10,则抛出异常

thrownewMyException(a);

常规退出"

compute

(1);

//a小于10,常规退出

compute(20);

//a大于10,则抛出异常

catch(MyExceptione){

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

当前位置:首页 > 求职职场 > 简历

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

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