第六章 Java异常处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package ex6_4_1; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*;
public class ThrowDemo extends JApplet{ JTextField tf1=new JTextField("try to use throw",50); JTextField tf2=new JTextField("this will not show on the screen"); //Initialize the applet public void init(){ try{ Container cp=new Container(); cp=this.getContentPane(); cp.setLayout(new BorderLayout()); cp.add(tf1,BorderLayout.NORTH); demo(); //此方法中人为抛出异常,同样具有终止程序执行的功能 cp.add(tf2); //cp.add(tf2)将不再被执行 } catch(NullPointerException e){ //捕获demo()抛出的 NullPointerException tf1.setText("catch an exception: "+e); } } void demo(){ throw new NullPointerException("this exception is thrown by init"); }}
//在try块结束前被执行的代码块
}
6.2 异常的捕获与处理
当程序运行中发生异常时,java的异常处理机制将按以下步骤处理: 1)产生异常对象(这个对象可以由系统产生,也可以在程序 中用new创建)并中断当前正在执行的代码,抛出异常对象。 2) 自动按程序中的catch的编写顺序查找“最接近的”异常匹 例6.2.1:下述程序没有捕获异常,所以程序将在发生异 配。一旦找到就认为异常已经得到控制,不再进行进一步查找。 常处终止,并由缺省处理程序输出错误信息。例 6.2.2: 这个匹配不需要非常精确,子类对象可以与父类的 catch相匹配。 本例捕获了异常,同时很好地说明了try、catch、finally 各块之间的处理关系。 3) 若有匹配则执行相应的处理代码,然后继续执行本try块之外 的其他程序。否则这个没有被程序捕获的异常将由缺省处理程序 处理,缺省处理程序将显示异常的字符串、异常发生位置等信息, 终止整个程序的执行并退出。 无论哪种情况都不可能再回到错误发生的地方继续执行。
第六章 Java的异常处理
6.1 异常和异常对象
Java语言用面向对象的方式来处理异常,异 常类都是Throwable的子类 。
一般来说Java程序不捕获也不抛出类Error的 对象(包括动态链接失败,虚拟机错误等),而 只处理Exception类的各子类对象。
6.2 异常的捕获与处理
Java中异常处理的一般形式是: try{ //被监视的代码块 } catch(异常类1 对象名1){ //异常类1的异常处理代码块 } catch(异常类2 对象名2){ //异常类2的异常处理代码块 }…… finally{ try块用来监视这段代码执行过程中是否 发生异常,若发生则产生异常对象并抛 出。
6.4 throw语句
编程人员可以用throw语句自行抛出异常,throw语句的语法如下:
throw Throwable类或其子类的对象。 throw 语句执行后,其后继语句将不再执行,执行流程将直接寻找后面 的catch语句,如果catch语句中的参数能匹配throw语句抛出的Throwable对 象,则执行相应的异常处理程序。如果catch语句中的参数没有一个能与该 对象相匹配,则由缺省的异常处理器终止程序的执行并输出相应的异常信 息。 例6.4.1:本例中demo()将人为地抛出一个异常,所以cp.add(tf2)将不再 被执行。
package ex6_2_2; public class Exception2 { int count=1; public Exception2(){ while(true){ try{ int x=6/(count--); System.out.println("in try,no exception"); } catch(ArithmeticException e){ System.out.println("in catch,divided by zero"); finally{ System.out.println("in finally"); if ( count == -1 ) break; } }//while System.out.println("end of program"); } public static void main(String[] args) { Exception2 exception2 = new Exception2(); }}
1. Java语言用面向对象的方式来处理异常,异 常类都是( )的子类 。 2. Throwable派生的两个异常: ( )、( )。 3. java异常处理不能嵌套。 4. 比较throw和throws区别。 5. 在异常中被监视异常的代码必须放在哪个语 句块中。 6. catch起什么作用。 7. 写出异常相关的关键字: try、()、()、 ()、()。 8. 比较final、finalize、finally。
6.6 使用异常处理的准则
异常处理的主要目的是在程序运行过程中捕获错误并进行相应的处理,以 便程序可以在修正错误的基础上继续执行。因此编写异常处理代码应遵循以 下二个原则:
1)尽可能在当前程序中解决问题,否则应将异常向更外层的程序抛出。
2)简化编码。不要因加入异常处理而使程序变得复杂难懂。
练习题
package ex6_3_2; import java.awt.Graphics; public class ArrayDivideby2 extends java.applet.Applet{ public void paint(Graphics g){ try{ int I=1,j=0,f; Array(); f=I/j; //产生一被0除异常 } catch(ArithmeticException e){ System.out.println("被0除异常:"+e); } } static void Array(){ try{ int c[]={1}; c[2]=99 ; //内层try块产生数组下标异常 } catch(ArrayIndexOutOfBoundsException e){ System.out.println("数组下标异常:"+e); }}}
package ex6_2_1; public class Frame1 { public Frame1() { int d=0; int a=10/d; //被0除,产生异常 System.out.println("never run this sentence"); //此语句将不被执行 } public static void main(String[] args) { Frame1 frame1 = new Frame1(); } }
//在try块结束前被执行的代码块
}
6.2 异常的捕获与处理
Java中异常处理的一般形式是: try{ //被监视的代码块 } catch(异常类1 对象名1){ //异常类1的异常处理代码块 } catch(异常类2 对象名2){ //异常类2的异常处理代码块 }…… finally{ catch用于捕获异常并处理它。
package ex6_5_1; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class ThrowsDemo extends JApplet { //Initialize the applet public void init(){ try{ f(); //调用f()方法 } catch(Exception e){ e.printStackTrace(); //在控制台上显示异常信息 } } void f() throws Exception{ //将异常处理任务交给 调用者 throw new Exception("throw from f"); //产生并抛出异 常 }}
package ex6_3_1; import java.awt.Graphics; public class ArrayDivideby extends java.applet.Applet{ public void paint(Graphics g) { try{ int I=1,j=0,f; try{ int c[]={1}; c[12]=99; } catch (ArrayIndexOutOfBoundsException e){ System.out.println("数组下标越界:"+e); } f=I/j; } catch(ArithmeticException e){ System.out.println("被0除"+e); } }}
}
6.3 try语句的嵌套
try语句的嵌套有显示嵌套和隐式嵌套两种形式,下面分别进行讲解: 一.显式嵌套 例6.3.1: try语句的显式嵌套 在某个方法中,某一个try块又包含另一try块,当内层try块抛出异 常对象时,首先对内层try块的catch语句进行检查,若与抛出异常类型匹 配则由该catch处理,否则由外层try块的catch处理。 二.隐式嵌套 在不同的方法中,若方法1的try块中调用方法2,而方法2又包含一 个try语句,则方法1中的try块为外层,方法2中的try为内层。
//在try块结束前被执行的代码块
}
6.2 异常的捕获与处理
Java中异常处理的一般形式是: try{ //被监视的代码块 } catcຫໍສະໝຸດ Baidu(异常类1 对象名1){ //异常类1的异常处理代码块 } catch(异常类2 对象名2){ //异常类2的异常处理代码块 }…… finally{ finally块中的语句无论是否发生异常都将 被执行。
6.3 try语句的嵌套
try语句的嵌套有显示嵌套和隐式嵌套两种形式,下面分别进行讲解: 一.显式嵌套 在某个方法中,某一个try块又包含另一try块,当内层try块抛出异 常对象时,首先对内层try块的catch语句进行检查,若与抛出异常类型匹 配则由该catch处理,否则由外层try块的catch处理。 例6.3.2:try语句的隐式嵌套 二.隐式嵌套 在不同的方法中,若方法1的try块中调用方法2,而方法2又包含一 个try语句,则方法1中的try块为外层,方法2中的try为内层。
6.5 throws语句
throws语句用于声明一个方法可能引发的所有异常,这些异常是要求 调用该方法的程序处理的。其语法为: 返回类型 方法名(参数表) throws 异常类型表 { //方法体 } 例6.5.1:本例中小应用程序的init()方法调用了f()方法,f()方法利用 throw new Exception("throw from f");语句产生并抛出异常,而且f()方法又 用throws Exception将处理异常的任务交给调用f()的方法(此处为init()), 在init()的catch块中用e.printStackTrace();打印相关信息。