欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第5章 Java例外处理.ppt

    • 资源ID:5030227       资源大小:412.50KB        全文页数:55页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第5章 Java例外处理.ppt

    第5章 Java例外处理,5.1 异常的基本概念 5.2 异常的处理机制 5.3 异常类的类层次,5.1 异常的基本概念,异常(Exception)是程序执行过程中出现的非正常事件,即各种意外情况。比如说: 用户输入出错 所需文件找不到 运行时磁盘空间不够 内存不够, 算术运算错 (数的溢出,被零除) 数组下标越界 当Java程序出现以上的错误时,就会在所处的方法中产生一个异常对象。这个异常对象包括错误的类型,错误出现时程序的运行状态以及对该错误的详细描述。下面我们先看一个简单的例子。,例5.1 public class ExceptionDemo public static void main(String args) int x=100; System.out.println(“The result is“+x/10); System.out.println(“Divided by zero: “+x/0); ,当我们对其编译后运行时,其对应的结果如下: c:jbuilder3javabinjava Exception Demo The result is10 Exception in thread “main“ java.lang.Arithmetic Exception: / by zero at Exception Demo.main(Exception Demo.java:5) 其意思是说,本程序执行到语句“System.out.println (“Divided by zero: “+x/0)”时,系统会抛出一个例外,该例外在Java中定义为Arithmetic Exception (即属于算术运算例外)。,5.2 异常的处理机制,我们知道,一旦程序在执行的过程中出现异常,往往有两种处理方式: (1) 当程序出现错误的时候,系统将终止程序的运行,如例5.1。在Java中这是属于运行异常,用户不加干预,完全交由系统对其进行处理。,(2) 当程序出现错误时,采用捕捉抛出(catch-throw)的面向对象编程方式。该种方式是当程序运行出错时,系统和程序抛出各种标准类型的错误,程序捕捉该错误并进行相应处理。由于异常均以标准的形式提供,使得程序员能以统一的方式对异常进行处理。 通常,Java的出错与异常处理采用“try, catch, throws”语句来实现,下面我们分别加以介绍。,5.2.1 异常的直接捕获与处理:try-catch try-catch语句构成Java对异常直接处理的基本处理单元,其一般语法如下: try program where errors may arise catch (ExceptionClass1 c) what to do with it catch (ExceptionClass2 d) what to do with it ,上述用法中,可能出现异常的语句放在由try语句所括住的程序块中。try块管理其所包含的语句并定义与之相关的异常指针范围,它的后面必须至少接一个catch语句。catch语句块负责处理各对应类型的异常。 实际编程过程中,如果我们对程序代码可能出现的异常不进行捕获,Java的编译环境就拒绝执行,并要求用户对其作出处理。看下例:,例5.2 import java.io.*; public class ExceptionDemo1 public static void main(String args) int i; File Input Stream fis=new File Input Stream(“file_in.txt“);,File Out put Stream fos=new File Out put Stream(“file_out.txt“); while(i=fis.read()!=-1) fos.write(i); fis.close(); fos.close(); 例5.2只是一个简单的文件输入/输出程序。该程序中定义了一个文件输入流和文件输出流,然后通过它们进行文件的拷贝。,当上述程序进行编译的时候,结果如下: c:JBUILD1javabinjavac ExceptionDemo1.java ExceptionDemo1.java:5: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileInputStream fis=new FileInputStream(“file_in.txt“); ExceptionDemo1.java:7: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while(i=fis.read()!=-1) 2 errors,系统异常信息告诉我们,两种异常程序员必须捕获,即File Not FoundExcetion和IOException。对例外进行处理时,用户往往想知道异常的具体信息,我们可利用异常父类Throwable中提供的方法get Message()得到有关异常事件的信息。方法print Stack Trace()可用来跟踪异常事件发生时执行堆栈的内容。这样,例5.2可改写为,例5.3 import java.io.*; public class ExceptionDemo1 public static void main(String args) int i; try FileInputStream fis=new FileInputStream(“file_in.txt“); FileOutputStreamfos=new FileOutputStream(“file_out.tx t“); while(i=fis.read()!=-1) fos.write(i);,fis.close(); fos.close(); catch (FileNotFoundException e) System.out.println(“The error is: “+e.getMessage(); e.printStackTrace(System.out); catch(IOException e) System.out.println(“The error is: “+e); ,程序中增加了对例外的处理语句后,就顺利通过了编译。catch语句的执行顺序是先捕获最特殊的异常,之后逐渐一般化,因为,IOException是FileNotFoundException的父类。 Java允许用户捕获实际需要捕获的异常类的超类,所以,一个catch语句就可以同时捕获多种异常。这样,例5.3中的try-catch语句又可以改写为 try . catch(Exception e) System.out.pritnln(“The error is: “+e.getMessage();,因为Exception类是FileNotFoundException类和IOException类的超类,所以对一段可能抛出大量不同类型的异常的程序来说,逐个捕获处理异常可能会较繁琐,而仅仅捕获它们父类的异常则会较方便。实际使用中,需要避免捕获最一般的异常类型(即超类Exception),因为捕获最一般的异常使得用户往往不能确切地判断异常的具体类型并作出相应的处理。针对例5.3,如果try-catch语句写为,try . catch(Exception e) System.out.pritnln(“The error is: “+e.getMessage(); catch(IOException e) System.out.println(“The error is: “+e); catch (FileNotFoundException e) System.out.println(“The error is: “+e.getMessage(); e.printStackTrace(System.out); ,则该异常的后两个catch捕获语句会始终匹配不到,造成编译器的混乱。所以说,捕获异常的顺序是和catch语句顺序相关的,希望读者注意它的用法。 与异常处理语句try-catch相关的另一条语句是finally语句。它为例外处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理,比如关闭文件或释放其他系统资源。实际使用中finally紧接于try-catch语句的最后一个catch块,基本语法如下:,try program where errors may arise catch (ExceptionClass1 c) what to do with it catch (ExceptionClass2 d) what to do with it finally .,finally语句的执行是非常决断的、无条件的执行的。无论是否出现异常,也不管出现哪一种异常或即使try语句块中包含有return、break、continue等语句,均须执行finally语句块所包含的语句。这就是说,finally语句的作用与C+中类的析构函数相似。比如在例5.3中,我们打开了文件file_in、file_out进行读/写操作,如果产生了异常,就可能需中断,此时,对应的文件有可能无法正常关闭,这会对文件造成破坏。但使用finally语句后,就可把方法中的所有善后工作作统一处理,既增强程序的可读性,又避免了对系统或文件的损害。所以,例5.3可改写为,例5.4 import java.io.*; public class ExceptionDemo1 public static void main(String args) int i; try FileInputStream fis=new FileInputStream(“file_in.txt“); FileOutputStreamfos=new FileOutputStream(“file_out.txt“); while(i=fis.read()!=-1) fos.write(i);,fis.close(); fos.close(); catch (FileNotFoundException e) System.out.println(“The error is: “+e.getMessage(); e.printStackTrace(System.out); catch(IOException e) ,System.out.println(“The error is: “+e); finally if(fis!=null|fos!=null); System.out.println(“Now closing file“); fis.close(); fos.close(); ,5.2.2 异常的间接声明抛弃 当在程序或代码块中出现异常时,Java语法要求要么对其捕获,要么在方法定义中用关键字throws声明异常类型并间接将其抛出,交给其调用者来进行处理。也就是说,异常对象可以从调用栈向后传播,直到有合适的方法对其进行捕获为止。例如: public type method Name (args If Any) throws ExceptionClass1, ExceptionClass2 code for method ,throws语句中同时可以给出多个异常类,说明该方法将不对这些异常进行处理,而是直接反馈给调用者。实际应用中,抛出的类可以是几个异常的父类。比如在上面代码中,假设ExceptionClass1、ExceptionClass2类的父类为super_Exception,那么我们可以简单地抛出类super_Exception。例如: public void Master () try slaver();, catch (NumberFormatException e) /process here catch (ArithmeticException e) /process here public void slaver( ) throws NumberFormatException, ArithmeticException / code here,5.2.3 直接抛出异常 throw语句表示直接抛出一个异常,后接一个可抛出的异常类对象。指令格式如下: throw Exception Object; 前面我们讨论的异常均由Java虚拟机或异常类的实例生成,而使用throw语句可以抛出程序员自行定义的异常类。例如: class ExceptionDemo2 extends Exception . public class Process Exception,public void Throwmethod() if ( / no exception occurred) else throw new ExceptionDemo2(); 当throw语句执行时,它后面的语句将不执行,此时程序转而寻找与之匹配的catch语句,执行相应的异常处理程序。,5.3 异常类的类层次,Java语言采用继承的方式组织各种异常,所有的异常类都直接或间接地继承于类Throwable。我们可用图5.1描述异常的常用类层次。 从图5.1中可以看出,Throwable类是所有异常类的父类。它分为两个子类:Error类和Exception类。Error类包括动态链接失败、虚拟机出错等异常,该类异常Java不要求捕获,同时系统也不会抛出该类异常。,图5.1 异常的常用类层次,类Exception又可细分为运行异常(Runtime Exception)和其他一般异常。与Error类相似,运行异常(Runtime Exception)也不需要程序对其进行捕获并处理,因为它表示Java虚拟机在运行时所产生的异常。该类异常的产生非常普遍,如果在每个可能产生这种异常的地方都加以处理,程序就会变得无法理解,从而影响程序的可读性和高效性。继承于类Exception的异常代表非运行时异常,该类异常必须明确地加以捕获并处理,否则就无法通过编译。例如,在例5.3中对File Not Found Exception和IOException两类异常我们都作出了捕获并处理。,对于运行异常和错误来说,它们之间的区别主要在于对系统所造成的危害轻重不同,恢复正常的难易程度也不一样。错误可以说是一种致命的异常。比如说当遇到诸如Linkage Error、Vritual Machine Error之类的错误时,系统是没有办法恢复的。而遇到除数为零的运行时异常Arithmetic Exception,我们可以给出捕获语句加以处理,不至于导致系统的崩溃。,最后,读者需要注意的是对异常的处理往往非常灵活。比如说对运行时异常一般不需要处理,但是假如需要输入一个整型数,而此时用户却输入一个字符串转换成整型,且不小心输入了非数字的字符串时,就会产生运行时异常类Number Format Exception。此时,若按照前面所说不对其加以捕获处理,系统就会被中断,无法进行下去,因此,程序中就需加入以下的代码:, String str=Dialog Box.request(“Please input a digit String: “); Try int d=Integer.parseInt(str); catch (Number Format Exception e) System.out.println(“ Illegal digit String in “+str); 下面给出一些常见的错误(Error)(表5.1)、一般异常(表5.2)及运行异常(Runtime Exception) (表5.3)的基本格式及功能。,表5.1 Java常见错误列表,表5.2 Java常见的一般异常列表,表5.3 Java常见的运行异常列表,当我们在使用异常时,应尽可能使用Java类库中已经定义好的类。前面我们讨论过的throw语句可以抛出用户自定义的异常类,其实,Java类库中提供了大多数常用的类库,往往只是在很少的情况下才需要用户自己定义异常类。用户自定义的异常类必须是Throwable的直接或间接的子类。总之,当我们使用异常的时候,可以参考以下几点建议:,(1) 对运行时异常类的处理,由于其发生的多样性,程序中可不对它进行处理,而直接交给系统去处理。 (2) 如果我们确定异常在程序中产生的地点或时间,则需像对一般异常处理的方式一样对其捕获并处理。 (3) 当Java所给定的异常类不能满足我们要求时,需要自定义异常类。如果该异常符合条件1,则应定义为运行时异常;如果符合条件2,则应定义为一般异常类。,下面我们给出一个完整的例子。该例是模拟整型除法运算,但使用了Java的图形用户界面,读者可以不管程序的其他用法,着重关注程序中对异常的处理方法。类Division Frame中的方法perform Division进行除法的运算,其中可能产生两种异常:Number Format Exception和Arithmetic Exception,但在该方法中并没有对它们进行捕获,只是通过throws语句将它们简单抛出,最后由调用者来进行捕获并处理。,例5.5 public class Main public static void main (String args) Division Frame divWin = new Division Frame(); div Win.setVisible(true); import javax.swing.*; import java.awt.*; import java.awt.event.*;,public class DivisionFrame extends ExitFrame / instance variables private JTextField numerator, denominator, result; private String task = “Enter integers and press '=' to perform division.“; private JLabel taskMsg = new JLabel(task, JLabel.CENTER); private String welcome = “Welcome to the deluxe integer-division calculator“; private JLabel statusMsg = new JLabel(welcome, JLabel.CENTER);,/ constructor public DivisionFrame ( ) setTitle(“Performing Integer Division“); setBounds(50, 100, 750, 200); Font f = new Font(“SansSerif“, Font.BOLD, 30); taskMsg.setFont(f); taskMsg.setForeground(Color.blue); statusMsg.setFont(f); statusMsg.setForeground(Color.blue); numerator = new JTextField(“0“, 7);,numerator.setFont(f); denominator = new JTextField(“1“, 7); denominator.setFont(f); result = new JTextField(“0“, 7); result.setFont(f); JLabel divSign = new JLabel(“/“, JLabel.CENTER); divSign.setFont(new Font (“SansSerif“, Font.BOLD, 50); divSign.setForeground(Color.black); JButton equalBut = new JButton(“=“); equalBut.setFont(f); equalBut.addActionListener(new ActionListener() ,public void actionPerformed(ActionEvent evt) try performDivision(); catch (NumberFormatException e) statusMsg.setForeground(Color.red); statusMsg.setText(“numbers must both be integers: try again“); taskMsg.setText(“ “); catch (ArithmeticException e) statusMsg.setForeground(Color.red); statusMsg.setText(“cannot divide by zero: try again“); taskMsg.setText(“ “); ,); JPanel p1 = new JPanel(); p1.add(numerator); p1.add(divSign); p1.add(denominator); p1.add(equalBut); p1.add(result); JPanel p2 = new JPanel(); p2.add(taskMsg); JPanel p3 = new JPanel(); p3.add(statusMsg); Container c = getContentPane(); c.add(p1, “Center“); c.add(p2, “South“); c.add(p3, “North“); ,public void performDivision ()throws NumberFormatException, ArithmeticException int numValue = Integer.parseInt(numerator.getText(); int denomValue = Integer.parseInt(denominator.getText(); int divValue = numValue/denomValue; result.setText(“+divValue); statusMsg.setForeground(Color.blue); statusMsg.setText(“division performed without error“); taskMsg.setText(task); ,当我们输入正确的数据时,程序的运行结果如图5.2所示;如果我们输入的第二个参数为0,则结果如图5.3所示;如果接下来输入非数字的字符,则结果如图5.4所示。,图 5.2,图 5.3,图 5.4,

    注意事项

    本文(第5章 Java例外处理.ppt)为本站会员(爱问知识人)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开