资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,10,章,异 常,讲师:李贺飞,新浪微博:尚硅谷,-,李贺飞,本章内容,第一节 异常的原理,第二节 异常的处理,第三节 声明和抛出异常,第四节 自定义异常类,第一节 异常的原理,异常:,在,Java,语言中,将程序执行中发生的不正常情况称为“异常”,异常是一种对程序运行过程中发生错误时进行通知的机制。,如:网络连接失败、用户输入错误或打开文件失败等。,异常以对象的形式出现,不同的异常对象中封装了相应的错误信息,异 常,1 public class TestException,2 public static void main(String args),3 System.out.println(Hello World!);,4,5 int n=Integer.parseInt(args0);,6 System.out.println(n=+n);,7 ,8,命令行执行:,java TestException 164 正常,java TestException abc NumberFormatException,java TestException ArrayIndexOutOfBoundsException,示例,TestException类,异常的分类,Java,语言提供了两大类异常:,编译时异常(受检异常),运行时异常(非受检异常),编译时异常:指程序中必须接受检查和处理的异常,由,Exception,类表示。,运行时异常:程序中可以不接受检查和处理,或致命性错误异常,由,RuntimeException,类或,Error,类表示。,异常的堆栈式抛出机制,为保证程序正常执行,代码必须对可能出现的异常进行处理。,第二节 异常的处理,常见异常,j,ava.lang.RuntimeException,ClassCastException,ArrayIndexOutOfBoundsException,NullPointerException,ArithmeticException,。,java.io.IOExeption,FileNotFoundException,EOFException,j,ava.lang.ClassNotFoundException,j,ava.lang.InterruptedException,java.io.FileNotFoundException,java.sql.SQLException,异常的处理方式之一:捕获处理异常,可使用trycatchfinally语句捕获异常,避免程序不正常终止,语法:,try,catch(),*finally,可使用多个,catch子句捕获多个异常,try-catch,示例,TestException类,1 public class TestException,2 public static void main(String args),3 try,4 int n=Integer.parseInt(args0);,5 System.out.println(n=+n);,6 catch(NumberFormatException e),7 System.out.println(,捕获第一个异常:,+e);,8 System.out.println(e.getMessage();,9 ,10 System.out.println(Hello World!-end);,11 ,12,多,catch,示例,TestException类,1 public class TestException,2 public static void main(String args),3 try,4 int n=Integer.parseInt(args0);,5 System.out.println(n=+n);,6 catch(NumberFormatException e),7 System.out.println(,捕获第一个异常:,+e);,8 System.out.println(e.getMessage();,9 catch(ArrayIndexOutOfBoundsException e),10 System.out.println(,捕获第二个异常:,+e);,11 catch(Exception e),12 System.out.println(“,捕获其他可能的所有异常:,+e);,13 ,14 System.out.println(Hello World!-end);,15 ,16,finally,示例,TestException类,1 public class TestException,2 public static void main(String args),3 try,4 int n=Integer.parseInt(args0);,5 System.out.println(n=+n);,6 catch(NumberFormatException e),7 System.out.println(,捕获第一个异常:,+e);,8 System.out.println(e.getMessage();,9 return;,10 catch(ArrayIndexOutOfBoundsException e),11 System.out.println(,捕获第二个异常:,+e);,12 catch(Exception e),13 System.out.println(,捕获其他可能的所有异常:,+e);,14 finally /,保证该块的语句总是被执行,15 System.out.println(,最终块,);,16 ,17 System.out.println(Hello World!-end);,18 ,19,练 习,编写,TestException类,,在,main方法中,接收两个命令行参数,将它们转换为整数,并用第二个数除以第一个数,打印结果。,在命令行运行程序,给出两个参数,测试以下情况,观察运行结果:,其中某个参数不是数字,第二个参数为,0,提示:,分别接收两个参数的语句为:,int n1=Integer.parseInt(args0);,int n2=Integer.parseInt(args1);,改写TestException类,的,main方法,在其中捕获可能发生的异常,。,运行并测试各种异常情况,确认是否均被捕获。,第三节 声明抛出异常,声明抛出异常,声明抛出异常是,Java,中处理异常的第二种方式,如果一个方法,(,中的语句执行时,),可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应,显示地,声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的,调用者,负责处理。,在方法声明中用,throws,语,句可以声明抛出异常的列表,,throws,后面的异常类型可以是方法中产生的异常类型,也可以是它的父类,。,声明抛出异常举例:,public void readFile(String file)throws FileNotFoundException,/,读文件的操作可能产生,FileNotFoundException,类型的异常,FileInputStream fis=new FileInputStream(file);,.,声明抛出异常,(2),import java.io.*;,public class Test6_4,public static void main(String args),Test6_4 t=new Test6_4();,try,t.readFile();,catch,(IOException e),public void readFile(),throws IOException,FileInputStream in=new FileInputStream(myfile.txt);,int b;,b=in.read();,while(b!=-1),System.out.print(char)b);,b=in.read();,in.close();,有可能找不到,filePath,指定的文件,所以抛出,FileNotFoundException,异常,在方法头部声明抛出,调用了一个声明抛出非运行时异常的方法,继续向上抛,交给调用者处理,方法体内可能抛出非运行时异常,调用,声明抛出非运行时异常的方法,声明抛出异常,(3),重写方法声明抛出异常的原则,重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对,methodA(),方法的调用,-,异常的捕获按父类声明的异常处理。,public class A,public void methodA()throws,IOException,public class B1 extends A,public void methodA()throws,FileNotFoundException,public class B2 extends A,public void methodA()throws,Exception,/,报错,人工抛出异常,Java,异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出,。,首先要生成异常类对象,然后通过,throw,语句实现抛出操作,(,提交给,Java,运行环境,),。,IOException e=new IOException();,throw e;,可以抛出的异常必须是,Throwable,或其子类的实例。下面的语句在编译时将会产生语法错误:,throw new String(want to throw);,第四节 自定义异常类,创建自定义异常类,一般地,用户,自定义异常,类都是,RuntimeException,的子类。,自定义异常类通常需要编写几个重载的构造器。,自定义的异常通过,throw,抛出。,自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。,用户自定义异常类,MyException,,用于描述数据取值范围错误信息。用户自己的异常类,必须继承,现有的异常类。,class MyException extends Exception,static final long serialVersionUID=1L;,private int idnumber;,public MyException(String message,int id),super(message);,this.idnumber=id;,public int getId(),return idnumber;,创建自定义异常类,使用自定义异常类,public class Test6_5,public void regist(int num)throws MyException,if(num 0),throw,new MyException(“,人数为负值,不合理”,3);,else,System.out.println(,登记人数,+num);,public void manager(),try,regist(100);,catch(MyException e),System.out.print(,登记失败,出错种类,+e.getId();,System.out.print(,本次登记操作结束,);,public static void main(String args),Test6_5 t=new Test6_5();,t.manager();,异常处理,5,个关键字,捕获异常,抛出异常,声明异常,try,catch,finally,执行可能产生异常的代码,捕获异常,无论是否发生异常,代码总被执行,throw,异常的生成阶段:,手动抛出异常对象,throws,异常的处理方式:,声明方法可能要抛出的各种异常类,例如:上游排污,下游治污,练习,3,public class ReturnExceptionDemo,static void methodA(),try,System.out.println(,进入方法,A);,throw new RuntimeException(,制造异常,);,finally,System.out.println(,用,A,方法的,finally);,static void methodB(),try,System.out.println(,进入方法,B);,return;,finally,System.out.println(,调用,B,方法的,finally);,public static void main(String args),try,methodA();,catch(Exception e),System.out.println(e.getMessage();,methodB();,判断程序的输出结果,练习,4,编写应用程序,EcmDef.java,,接收命令行的两个参数,要求不能输入负数,计算两数相除。,对数据类型不一致,(,NumberFormatException,),、缺少命令行参数,(ArrayIndexOutOfBoundsException,、,除,0(ArithmeticException),及输入负数,(EcDef,自定义的异常,),进行异常处理。,提示:,(1),在主类,(EcmDef),中定义异常方法,(ecm),完成两数相除功能。,(2),在,main(),方法中使用异常处理语句进行异常处理。,(3),在程序中,自定义对应输入负数的异常类,(EcDef),。,(4),运行时接受参数,java EcmDef 20 10,/args0=“20”args1=“10”,(5)Interger,类的,static,方法,parseInt(String s),将,s,转换成对应的,int,值。如,int a=Interger.parseInt(“314”);/a=314;,异常处理机制(,1,),在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行,x/y,运算时,要,检测分母为,0,,数据为空,输入的不是数据而是字符,等。过多的分支会导致程序的代码加长,可读性差。因此采用异常机制。,Java,异常处理,Java,采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,并易于维护。,异常处理机制(,2,),Java,提供的是异常处理的,抓抛模型,。,Java,程序的执行过程中如出现异常,会生成一个,异常类对象,,该异常对象将被提交给,Java,运行时系统,这个过程称为,抛出,(throw),异常,。,异常对象的生成,由虚拟机,自动生成,:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出,自动抛出,由开发人员,手动创建,:,Exception exception=new ClassCastException();,创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象,一样,异常处理机制(,3,),如果一个方法内抛出异常,该异常,对象,会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为,捕获,(catch),异常,。,如果一个异常回到,main(),方法,并且,main(),也不处理,则程序运行终止。,程序员通常只能处理,Exception,,而对,Error,无能为力。,捕获异常,(2),捕获异常的有关信息:,与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。,getMessage,(),获取,异常信息,返回,字符串,printStackTrace(),获取,异常类名和异常信息,以及异常出现在程序中的,位置,。返回值,void,。,异常名称,说明信息,堆栈信息,练习,1,编写一个类,TestException,,在,main,方法中使用,try,、,catch,、,finally,,要求:,在,try,块中,编写被零除的代码。,在,catch,块中,捕获被零除所产生的异常,并且打印异常信息,在,finally,块中,打印一条语句。,体 会,捕获和不捕获异常,程序的运行有什么不同。,体会,try,语句块中可能发生多个不同异常时的处理。,体会,finally,语句块的使用。,
展开阅读全文