程序异常知识点_第1页
程序异常知识点_第2页
程序异常知识点_第3页
程序异常知识点_第4页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、知识点:1、 什么是异常。异常是程序正常执行过程中出现的不正常的情况。例如:人在成长过程中,是个正常的执行过程,但成长过程中会经常生病,这就是异常。为了避免这种不正常的情况,我们会采取一系列措施,比如:从小锻炼身体,吃新鲜干净的食物,营养合理的搭配,以增强我们的体质。提高抗病能力。程序我们为了提高它运行时的健壮性,我们也得采用一些措施。那么怎么提高程序的健壮性呢?JAVA 程序中我通过异常的捕获来增加程序的健壮性。2、 异常捕获的顺序是怎样的呢?当一个异常发生或抛出。那么正常的程序执行序列将被终止,程序将对异常进行处理,我们称之为抛出异常被捕获。JAVA 中通过使用catch 语句把可能抛出异

2、常的语句包起来。例如:前面讲到资源文件类Propertiestry-类在进行文件加载时,使用以下语句捕捉异常。tryProperties pro=new Properties();Pro.load(newFileInputStream( “ c:/perties” );3、 异常的类型是怎样的呢?所有异常类的超类是Throwable 。在Throwable下有两个子类,一个是Error ,另一个是Exception 。 Error是错误,程序员无法控制,Exception是异常,程序员可以通过异常捕获加以控制。例如:电脑运行中中毒了,我们可以通过杀毒软件来处理,处理完了以后可以继

3、续使用,这叫异常,我们可以控制。但电脑出现了蓝屏或死机的时候,我们就不能进行任何操作了。这就是错误,我们无法控制。4、 程序中异常是怎么发生的呢?StringinputStr = JOptionPane.showInputDialog(null,“请输入年龄”);intage=Integer.parseInt(inputStr);以上代码要求用户输入年龄,年龄是个数字。但通过showInputDialog得到的是个字符串。所以我们需要Integer.parseInt(inputStr) ,将字符串转成数字。这个时候,如果用户输入的不是一个数字型的字符串,而是一个非数字的字符串(如字母、符号),

4、在进行Integer.parseInt(inputStr) 转化是就会发生一个异常。如果我们不对它作任何处理,程序就有可能因此终止掉。5、 怎样捕获一个异常呢。a、 把正常运行的代码放在try 块里。b、 如果程序中出现了异常就把异常抛出在常。那么就会进行处理。处理的代码写在catch 中,如果catch 块中。catch中能捕获抛出的异try程序块里面的语句是按顺序执行的语句当序块,try 程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的catch 程序块里面的语句被执行。catch程当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句。如果在tryca

5、tch 下面的语句程序块中没有抛出异常,那么catch块将被忽略。程序将继续执行try-例如:try“开始” );/1int x=4/0;/2“执行” );/3catch(Exception e)“发生异常”);/4“异常处理外部”);这是发生异常的情况,在 try 块里顺序执行,先打出“开始”,没有异常继续执行,当执行到第 2 行时,因为 0 不能做除数,所以会发生一个算术异常。这个时候就会跳过try 块里剩下的语句转去执行 catch 块中的内容。所以第 3 行就不能执行。跳到 catch 块中执行第 4 句,打出“发生异常”。执行完以后接着往下顺序执行。打出第 5 行“异常处理外部”。t

6、ry“开始”);/1int x=4/2;/2“执行”);/3catch(Exception e)“发生异常”);/4“异常处理外部”);这是正常情况,在try 块里顺序执行,先打出“开始”,没有异常继续执行,当执行到第2 行时,得到x 的值为2,不会有异常。这个时候继续执行到第3 行,打出“执行”。因为在try 块中没有任何异常,执行完以后接着往下顺序执行。打出第5 行“异常处理外部”。在 Throwable 类中有两个方法,可以用于获取抛出异常的信息getMessageprintStackTrace6、 抛出异常在一个 try-catch语句中,当有多个catch 块的时候,它们被顺序检查在

7、检查过程中,注意异常的匹配关系是很重要的当一个异常被抛出,与它相匹配的catch块被执行,其它的catch 块,就被忽略掉不再执行如果没有 catch 块匹配抛出的异常,那么系统会在堆栈中搜索,找到一个匹配的捕获方法。如果仍然没有找到,那么系统将处理抛出异常什么叫异常和catch 块相匹配:1、抛出的异常和捕捉的异常是同一个类2、抛出的异常是捕捉异常的子类3、多个catch 块中如果捕捉的异常之间有继承关系那么不要把父类放在子类之前(这种做法也不被允许)4、尽量不要偷懒使用具体异常类而不要使用Exception例如 :try int a=new int 4 ;System. out .prin

8、tln(a6);/1inti=3/0;/2System. out .println(" 算术错误 " );捕获第2 行异常捕获第1 行异常System. out .println(" 数组下标越界" );不同的异常由不同的catch 块进行捕获。发生异常时由相应的catch 块进行处理。Catch 块中怎么捕获异常?tryint i=3/0;抛出异常和捕获异常是同一个类算术错误 ");tryint i=3/0;抛出异常是捕获异常的子类算术错误 ");try int a=new int 4 ;System. out .println(a

9、6); catch (java.lang. Exception e)System. out .println(" 发生异常" );System. out .println(" 数组下标越界 " );这 种方 式不被 允许, 因为catch块前 一个异 常ExceptionArrayIndexOutOfBoundsException的父类。所以有异常前一个异常捕获了。后一个catch 块永远不会被执行。编译会出错。是后一个异常catch块都try int a=new int 4 ;System. out .println(a6);System. out .

10、println(" 数组下标越界 " );System. out .println(" 发生异常" );这种方式允许。如果有数组下标越界异常由第一个常由第二个catch 块处理。catch块处理。如果有其它异7、如果有一块代码不管是否发生异常抛出都要被执行,我们使用关键字finally这样的机制有助于我们进行系统资源的回收。比如:在数据库操作时,如果发生了异常,那么数据库连接就可能不会关闭,而一直长驻内存。在进行IO 文件读取和写入时,如果发生了异常就可能流不会关闭。所以使用finally 可以解决这样的问题。Trycatch()finally这样的结构

11、可以用警察抓小偷来说明,警察抓小偷,如果小偷守法(没有异常)则警察就不会抓他,如果小偷违法(发生异常),则警察就抓它往监狱里放(catch 代码块)。不管抓没有抓到,警察工资照拿。(finally 内容 )publicvoid change()try intx=9/3;“正常执行” ); catch (Exception e)System. out .println(" 发生异常 " );finallySystem. out .println("finally内容 " );因为正常执行,所以catch 里内容不会执行。执行结果是“正常执行”和“final

12、ly内容”publicvoid change()try intx=9/0;“正常执行” ); catch (Exception e)System. out .println(" 发生异常 " );finallySystem. out .println("finally内容 " );因为发生异常,所以catch 里内容执行。执行结果是“发生异常”和“finally 内容”8、关于 finally 的问题大家都知道return 是跳出方法的语句,如果在try 里有 return 语句那么finally 里的内容会不会执行呢?答案是会的。会在return 语句

13、之前执行,执行完finally语句之后, return 语句再执行。publicvoid change()try intx=9/0;/1return; catch (Exception e)System. out .println(" 发生异常" );finallySystem. out .println("finally内容");System. out .println(" 异常外部内容" );该代码发生了异常。所以第一行代码以下语句会被忽略,所以 return 语句不会执行。该代码执行结果为“发生异常”、“ finally 内容”

14、、“异常外部内容”publicvoid change()try intx=9/4;System. out .println(" 正常执行return;" ); catch (Exception e)System. out .println(" 发生异常" );finallySystem. out .println("finally内容");System. out .println(" 异常外部内容" );该代码没有发生异常。顺序执行。先打“正常执行”,遇到 return 语句后,在返回前,先执行“ finally

15、内容”再做返回。因为方法已经跳出,所以“异常外部内容”不会执行。finally在任何时候都会执行,但有一个例外那就是程序终止时,不会执行。publicvoid change()try intx=9/4;“正常执行”);System.exit(0); catch (Exception e)System. out .println(" 发生异常" );finallySystem. out .println("finally内容");System. out .println(" 异常外部内容" );因为没有异常,所以“正常执行”会打出来,但

16、这个时候程序终止运行。所以 finally 内容不会打出来。9、关于异常对象异常也是一个对象。它是Exception类或子类的一个对象publicvoid change()try intx=9/0;/1 catch (Exception e)/2System. out .println(" 发生异常 " );在执行到第1 行时,发生了异常。这时候会产生一个和异常相匹配的异常对象。然后在第 2 行时,用一个Exception e的一个变量去指向它。这个时候,如果人为的抛出一个异常也可以达到相同的效果。这就是 throw 语句。将显示的产生一个异常对象,并做抛出。语法如下:th

17、row异常对象 (throw new Exception()。10、传播异常一个方法可以抛出异常,这样的话,在方法里我们就不用去捕获方法里可能发生的相关异常。那么谁去处理这个异常呢?由调用该方法的代码块去处理。那么怎么样在方法里抛出异常呢?我们需要修改方法的声明头,声明方法传播的异常类型我们使用关键字throws 来完成这个声明例: void c( ) throws Exception .void d( ) throws Exception .在 d()方法中抛出了 Exception 异常,但在方法体里却可以不产生异常对象。就象要开枪先瞄准,但瞄准后可以不开枪。11、异常的类型异常会为编译期

18、异常和运行期异常。 (或检查异常和非检查异常)其中运行期异常是 RuntionException 类和它的子类。除此之外都是编译期异常。编译期异常是我们必须要捕获的,而运行期异常却可以捕获,也可以不捕获。就象警察一样,大案和要案是必须要立案侦破的,而小偷小摸的毛贼,可以抓也可以不抓。编译异常我们必须要处理,要么用try-catch 包围,要么做方法抛出。如果一个方法抛出编译期异常,那么调用该方法时,必须处理,如果抛出运行期异常,那么调用该方法时,可处理可不处理。void C( ) throws Exception .void a()tryc();“异常” );public class TExc

19、eptionpublic static void main(String args)TException te = new TException();te.throwException();/1te.throwAException();/2te.throwCException();/3te.throwDException();/4public void throwAException() throws Throwablepublic void throwCExcetion() throws Exceptionpublic void throwException() throws MyExcep

20、tionpublic void throwDException() throws MyCExceptionclass MyCException extends Exceptionpublic MyCException()public MyCException(String msg)super(msg);class MyException extends RuntimeExceptionpublic MyException()public MyException(String msg)super(msg);代码分析:在 main 方法里分别调用了四个方法。其中第1方法抛出MyException异常。而MyException 是不处理。不会发生编译错误。第2 行代码调用行代码调用throwException方法。该RuntimeException 的子类,所以可以throwAException方法,该方法抛出Throwable 。这是所有异常和错误的超类,包含编译期异常,所以必须处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论