异常处理和反射_第1页
异常处理和反射_第2页
异常处理和反射_第3页
异常处理和反射_第4页
异常处理和反射_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

关于异常处理和反射教学目标理解异常的概念,熟悉异常的分类、Exception类、Java的异常处理机制及声明抛出异常、自定义异常的方法;熟悉log4j的基本用法;理解反射的概念,熟悉反射中常用类的基本用法。重点:异常、反射的概念,log4j的基本用法,反射中常用类的基本用法,难点:异常、反射的概念,log4j的基本用法,反射中常用类的基本用法第2页,共54页,2024年2月25日,星期天1、异常处理在编写、运行程序时,会碰到许多错误,也有不同的处理方式publicclassA{ publicstaticvoidmain(String[]args){

intarray[]={10,20,30}; inti;

for(i=0;i<=3;i++) System.out.println(array[i]); System.out.println("程序运行完毕!"); }}(1)引例程序运行结果:102030Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atA.main(A.java:6)intarray[]={10,20,30};inti;for(i=0;i<=3;i++) System.out.println(array[i]);第3页,共54页,2024年2月25日,星期天(2)异常的概念概念:异常是程序执行过程中遇到特殊条件时发生的不正常事件。(英文:exception,意思:例外)异常事件将会中断程序的正常执行过程;Java具有可确保在程序内处理异常的内置功能,增加健壮性。Java的一个重要观点:一切皆对象。对异常的处理也不例外,定义了异常类,并通过异常类的实例来表示异常事件;对异常的处理机制也成为判断一种语言是否成熟的标准;好的异常处理机制会使程序员更容易写出健壮的代码,防止代码中Bug的蔓延。第4页,共54页,2024年2月25日,星期天ArithmeticException:除数为0时的算术异常NullPointerException:没有给对象分配内存空间,而又去访问对象的空指针异常FileNotFoundException:找不到文件的异常ArrayIndexOutOfBoundsException:数组元素下标越界异常NegativeArraySizeException:数组长度为负数异常NumberFormatException:数据格式不正确异常ClassNotFoundException:找不到相应类的异常……异常的例子:第5页,共54页,2024年2月25日,星期天这些异常类位于java.lang包中第6页,共54页,2024年2月25日,星期天

Java把程序运行过程中发生的错误分为两类:错误(Error):JVM系统内部错误、资源耗尽等严重情况异常(Exception):

其它因编程错误或偶然的外在因素导致的一般性问题。

Throwable类的父类是Object,Throwable类有两个直接类:Error和Exception。只有Throwable类的子类才可以作为一个异常被抛出。具体如下图所示:(3)异常的分类第7页,共54页,2024年2月25日,星期天这类错误出现时,除了终止程序外别无选择。所以,不应该抛出。这类异常是由于编程者的错误引发的,只要编程时加以判断,就可以避免。这类异常的出现是因为意外情况造成的(程序可能很好),是捕获的重点。第8页,共54页,2024年2月25日,星期天异常类的层次第9页,共54页,2024年2月25日,星期天常见的异常受检(checked)异常:是指编译器要求必须处置的异常,即程序在运行时由于外界因素造成的一般性异常未找到指定名称类的异常:java.lang.ClassNotFoundException访问不存在文件的异常:java.io.FileNotFoundException操作文件时发生的异常:java.io.IOException操作数据库时发生的异常:java.sql.SQLException第10页,共54页,2024年2月25日,星期天非受检(unchecked)异常:是指编译器不要求强制处置的异常。一般是指因设计或实现方式不当导致的问题错误的类型转换异常:java.lang.ClassCastException组下标越界异常:java.lang.ArrayIndexOutOfBoundsException空指针访问异常:java.lang.NullPointerException除零溢出异常:java.lang.ArithmeticException第11页,共54页,2024年2月25日,星期天构造方法:publicException()publicException(Strings)

说明:字符串s是对该异常的描述常用方法:publicStringtoString():返回当前异常对象信息的描述;publicStringgetMessage():返回当前异常对象信息的详细描述;publicvoidprintStackTrace():用来跟踪异常事件发生时执行堆栈的内容(4)Exception类的构造方法和一般方法第12页,共54页,2024年2月25日,星期天Java提供的异常处理机制有两种:使用try…catch捕获异常:将可能产生异常的代码放在try语句中进行隔离,如果遇到异常,程序会停止执行try块的代码,跳到catch块中进行处理使用throws声明抛出异常:当前方法不知道如何处理所出现的异常,该异常应由上一级调用者进行处理,可在定义该方法时使用throws声明抛出异常(5)Java的异常处理机制第13页,共54页,2024年2月25日,星期天Java的异常处理机制优点:将异常处理代码和正常的业务代码分离,提高了程序的可读性,简化了程序的结构,保证了程序的健壮性;将不同类型的异常进行分类,不同情况的异常对应不同的异常类,充分发挥类的可扩展性和可重用性的优势;可以对程序产生的异常进行灵活处理,如果当前方法有能力处理异常,就使用try…catch捕获并处理;否则使用throws声明要抛出的异常,由该方法的上一级调用者来处理异常。第14页,共54页,2024年2月25日,星期天//A.java的改进版本publicclassA2{ publicstaticvoidmain(String[]args){ intarray[]={10,20,30}; inti;

try{ for(i=0;i<=3;i++) System.out.println(array[i]);

}catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("异常简要说明:"+e.toString()); System.out.println("异常详细说明:"+e.getMessage()); System.out.println("发生异常位置:"); e.printStackTrace(); } System.out.println("程序运行完毕!"); }}抛出异常捕获异常处理异常第15页,共54页,2024年2月25日,星期天程序运行结果:102030异常简要说明:java.lang.ArrayIndexOutOfBoundsException:3异常详细说明:3发生异常位置:java.lang.ArrayIndexOutOfBoundsException:3atA2.main(A2.java:8)程序运行完毕!

从运行结果可以看出,增加了try…catch…结构后,程序的执行过程有明显不同:当出现异常时,捕获后并进行相应处理,输出相关信息。 更重要的是程序得以顺利执行,并没有中途退出。第16页,共54页,2024年2月25日,星期天(6)try…catch…finally语句格式:

try{ ...... //可能产生异常的代码}catch(ExceptionName1e1){ ...... //当产生ExceptionName1型异常时的处理语句}catch(ExceptionName2e2){...... //当产生ExceptionName2型异常时的处理语句}[finally{...... //无论是否抛出异常都会执行的语句,即使在catch块中有return语句,一般用来做收尾工作,如:关闭文件

}]第17页,共54页,2024年2月25日,星期天执行流程:第18页,共54页,2024年2月25日,星期天代码片段: floatmyFloatArray[]=newfloat[10]; inti; if(argv.length==0)

System.out.println("\n\tUsage:CheckedExceptionsDemointvalue\n"); else{

try{ i=Integer.parseInt(argv[0]);

myFloatArray[i-1]=(float)11.234;

System.out.println(myFloatArray[i]);

}catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("\n\tInputvaluecannotexceed10\n"); return;

}catch(NumberFormatExceptione){ System.out.println("\n\tInputvalueshouldbeaninteger\n"); return;

} }可能出错第19页,共54页,2024年2月25日,星期天importjava.io.*;publicclasstry_catch_finally{ publicstaticvoidmain(String[]args){ RandomAccessFilefile; //随机存取文件对象

try{ file=newRandomAccessFile(“F:\\abc.txt","r"); for(inti=0;i<20;i++)

System.out.print((char)file.readByte());//读取1个字节并输出 file.close();

}catch(FileNotFoundExceptione1){ e1.printStackTrace();

}catch(IOExceptione2){ e2.printStackTrace();

}finally{ System.out.println("不管是否有异常,此语句都要执行");

} }}程序运行结果:(文件不存在时)java.io.FileNotFoundException:abc.txt(系统找不到指定的文件。)atjava.io.RandomAccessFile.open(NativeMethod)atjava.io.RandomAccessFile.<init>(RandomAccessFile.java:212)atjava.io.RandomAccessFile.<init>(RandomAccessFile.java:98)attry_catch_finally.main(try_catch_finally.java:6)不管是否有异常,此语句都要执行程序运行结果:(文件存在,但长度<20字节时)Goodmorning!java.io.EOFExceptionatjava.io.RandomAccessFile.readByte(RandomAccessFile.java:591)attry_catch_finally.main(try_catch_finally.java:8)不管是否有异常,此语句都要执行第20页,共54页,2024年2月25日,星期天 至于说去捕获什么类型的异常,这要依赖于以下两方面:编程经验:多读、多写查看类的方法说明(javaAPI文档)例如:publicstaticintparseInt(String

s)throwsNumberFormatException

publicRandomAccessFile(String

name,String

mode)throwsFileNotFoundExceptionpublicfinalbytereadByte()throwsIOException第21页,共54页,2024年2月25日,星期天 请注意:当有多个catch子句时,首先捕获最具体的异常,然后捕获较一般的异常,直到捕获所有异常,例如:try{ ……} catch(Exceptione){

……}

catch(ArrayIndexOutOfBoundsExceptione){

……} catch(NumberFormatExceptione){ ……}错误!try{ ……} catch(NumberFormatExceptione){

……}

catch(ArrayIndexOutOfBoundsExceptione){

……} catch(Exceptione){ ……}正确!第22页,共54页,2024年2月25日,星期天(7)自动关闭资源的try语句格式:try(//声明、初始化资源代码){ //业务实现代码(可能发生异常) ......} 从Java7开始,增强了try语句的功能,允许在try关键字后紧跟一对小括号,在小括号中可以声明、初始化一个或多个资源,当try语句执行结束时会自动关闭这些资源。 这相当于包含了隐式的finally块,它用于关闭前面所访问的资源。因此,自动关闭资源的try语句后面可以没有catch块,也可以没有finally块。第23页,共54页,2024年2月25日,星期天publicstaticvoidmain(String[]args){//自动关闭资源的try语句,JDK7.0以上才支持

try(FileInputStreamfis=newFileInputStream("zkl.txt")){//对文件的操作...}catch(IOExceptionioe){ System.out.println(ioe.getMessage()); } //包含了隐式的finally块,fis.close()关闭资源}只有JDK版本是7.0或以上,才能使用自动关闭资源的try语句第24页,共54页,2024年2月25日,星期天(8)嵌套的try…catch语句即在一个try…catch语句中嵌套了另外一个try…catch语句try{Scannerscanner=newScanner(System.in);System.out.println("请输入第1个数:");//从键盘获取一个字符串

Stringstr=scanner.next();//将不是整数数字的字符串转换成整数,

//会引发NumberFormatExceptionintn1=Integer.parseInt(str);try{FileInputStreamfis=new FileInputStream("zkl.txt");}catch(IOExceptionioe){System.out.println(ioe.getMessage());}第25页,共54页,2024年2月25日,星期天System.out.println("请输入第2个数:");//从键盘获取一个整数

intn2=scanner.nextInt();System.out.println("您输入的两个数的商是:" +n1/n2);}catch(Exceptionex){ex.printStackTrace();}System.out.println("程序结束!");第26页,共54页,2024年2月25日,星期天(9)多异常捕获从Java7开始,一个catch块可以捕获多种类型的异常格式:try{ //业务实现代码(可能发生异常) ......}catch(异常类A[|异常类B...|异常类N]异常对象){ //多异常捕获处理代码}......//可以有多个catch语句其中:捕获多种类型的异常时,多种异常类型之间使用竖杠“|”进行间隔;多异常捕获时,异常变量默认是常量,因此程序不能对该异常变量重新赋值。第27页,共54页,2024年2月25日,星期天可以使用throw或throws关键字:使用throw抛出一个异常类对象,由相应catch语句捕获格式:throw异常类对象使用throws声明抛出一个异常类序列,由上一级调用者进行处理格式:[访问符]<返回类型>方法名([参数列表])throws异常类1[,异常类2...,异常类n]{ //方法体}(10)抛出异常第28页,共54页,2024年2月25日,星期天//throws子句指示哪个方法可能正在抛出异常classCar{

privatefloatspeed=0;

privatefloatMAX_V=200;

publicvoidaccelerate(floatinc)throws

MotorException{

if(speed+inc>MAX_V){

thrownewMotorException(“Theengineisbroken”);

}elsespeed+=inc;

}}问题:请问throws与throw的区别。回答:throws是在方法声明时,指出可能抛出的异常,而方法中的throw则是具体抛出一个异常实例。accelerate()方法抛出一个异常,这是由throws子句指定的第29页,共54页,2024年2月25日,星期天(11)自定义异常除了使用标准异常外,用户还可以通过都继承Exception或RuntimeException类定义自己的异常。classMotorExceptionextendsException{

publicMotorException(){super();}

publicMotorException(Strings){super(s);}}classCar{

privatefloatspeed=0;

privatefloatMAX_V=200;

publicvoidaccelerate(floatinc)throws

MotorException{

if(speed+inc>MAX_V){

thrownewMotorException(“theengineisbroken”);

}else{

speed+=inc;

}

}}第30页,共54页,2024年2月25日,星期天classpilot{

publicstaticCarcar;

publicstaticvoidmain(String

args[]){

car=newCar();

try{

for(;;)

car.accelerate(0.4f);

}catch(MotorExceptionme){

System.out.println(“Mechanicalproblem:“+me);

}

}}程序运行结果:Mechanicalproblem:MotorException:theengineisbroken第31页,共54页,2024年2月25日,星期天2、开源日志记录工具log4j希望以文件记录异常信息,甚至记录程序正常运行的关键步骤信息,而不是在控制台上输出,这种情况该如何处理呢?使用流行的开源日志记录工具-log4j来实现第32页,共54页,2024年2月25日,星期天日志(log)主要用来记录系统运行中一些重要操作信息;便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题。log4j是一个非常优秀的开源日志记录工具控制日志的输出级别;控制日志信息输送的目的地是控制台、文件等;控制每一条日志的输出格式。网址:/log4j/2.x下载log4j2.x版本jar文件(1)日志第33页,共54页,2024年2月25日,星期天第34页,共54页,2024年2月25日,星期天举例:(2)log4j的属性配置文件pertieslog4j.rootLogger=DEBUG,A1,F1#DEBUG,INFO,WARN,ERROR,FATALlog4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{MM-ddHH:mm:ss}[%c]-[%p]%m%nlog4j.appender.F1=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.F1.File=c:/logs/seplog4j.appender.F1.DatePattern='-'yyyy-MM-dd'.log'log4j.appender.F1.layout=org.apache.log4j.PatternLayoutlog4j.appender.F1.layout.ConversionPattern=%-d{MM-ddHH:mm:ss}[%c]-[%p]%m%n第35页,共54页,2024年2月25日,星期天Log4j三大组件Logger:日志类别五大级别:DEBUG、INFO、WARN、ERROR、FATALAppender:日志输出目的地Layout:格式化输出日志信息第36页,共54页,2024年2月25日,星期天Log4j配置属性Logger格式:log4j.rootLogger=[level],appenderName,appenderName,…说明:level是日志记录的优先级:FATAL、ERROR、WARN、INFO、DEBUG(由高到低)例如:log4j.rootLogger=DEBUG,A1,A2优先级为:DEBUG记录器有两个:A1、A2第37页,共54页,2024年2月25日,星期天Log4j配置属性Appender格式:log4j.appender.appenderName=属性值org.apache.log4j.ConsoleAppender(控制台)org.apache.log4j.FileAppender(文件)org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)可选项:log4j.appender.appenderName.option1=value1Threshold、ImmediateFlush、Append、File、DatePattern、MaxFileSize、MaxBackupIndex第38页,共54页,2024年2月25日,星期天Log4j配置属性Layout格式:log4j.appender.appenderName.layout=属性值org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)可选项:log4j.appender.appenderName.layout.option1=value1ConversionPattern(举例:%-d{MM-ddHH:mm:ss}[%c]-[%p]%m%n)第39页,共54页,2024年2月25日,星期天Log4j配置属性Layout-格式符号含义%p:输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyMMMddHH:mm:ss,SSS},输出类似:2002年10月18日22:10:28,921%r:输出自应用启动到输出该log信息耗费的毫秒数%c:输出日志信息所属的类目,通常就是所在类的全名%t:输出产生该日志事件的线程名%l:输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。例如:Testlog4.main(TestLog4.java:10)%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像javaservlets这样的多客户多线程的应用中%%:输出一个"%"字符%F:输出日志消息产生时所在的文件名称%L:输出代码中的行号%m:输出代码中指定的消息,产生的日志具体信息%n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行第40页,共54页,2024年2月25日,星期天第一步:先下载log4j所使用的JAR文件,再在项目中加入(2)如何使用log4j记录日志第二步:在src目录中创建perties文件第41页,共54页,2024年2月25日,星期天第三步:编写perties,配置日志信息###设置Logger输出级别和输出目的地###log4j.rootLogger=debug,stdout,logfile###把日志信息输出到控制台###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.errlog4j.appender.stdout.layout=org.apache.log4j.SimpleLayout###把日志信息输出到文件:jbit.log###log4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=jbit.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}%l%F%p%m%n日志信息将写到文件中指定日志输出的文件名指定日志布局类型设置优先级别为debug、日志被输出到多个输出源日志信息将写到控制台信息打印到System.err上指定日志布局类型优先级从高到低分别是ERROR、WARN、INFO、DEBUG在此处,如果优先级别设为info,那么使用debug方法打印的日志信息将不被输出指定转换模式第42页,共54页,2024年2月25日,星期天第四步:在程序中使用log4j记录日志信息关键点:1)获取Logger:Loggerlogger=Logger.getLogger(AClass.class);

2)调用Logger中的方法,具体如下:

publicvoiddebug(Objectmessage); publicvoidinfo(Objectmessage); publicvoidwarn(Objectmessage); publicvoiderror(Objectmessage);说明:参数message为输出信息第43页,共54页,2024年2月25日,星期天publicclassTest{

privatestaticLoggerlogger=Logger.getLogger(Test11.class.getName()); publicstaticvoidmain(String[]args){ try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt();

logger.debug("输入被除数:"+num1); System.out.print("请输入除数:"); intnum2=in.nextInt();

logger.debug("输入除数:"+num2); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2));

logger.debug("输出运算结果:"+String.format("%d/%d=%d", num1,num2,num1/num2)); }catch(InputMismatchExceptione){

logger.error("被除数和除数必须是整数",e); }catch(ArithmeticExceptione){

logger.error(e.getMessage()); }catch(Exceptione){

logger.error(e.getMessage()); }finally{ System.out.println("欢迎使用本程序!"); } }}获取日志记录器记录异常信息记录关键操作步骤第44页,共54页,2024年2月25日,星期天运行效果展示控制台输出效果异常情况下输出到控制台的日志信息正常情况下输出到控制台的日志信息输出到文件jbit.log的日志信息文件输出效果第45页,共54页,2024年2月25日,星期天3、反射(Reflection)的概念在Java运行时环境中,对任意一个类,能否知道类的属性和方法?对任一个对象,能否调用它的所有方法?答案是肯定的。Java语言的反射机制是通过Java对象动态获取类的信息及动态调用对象的方法。Java的反射机制主要功能:在运行时判断任意一个对象所属的类;获取类的信息,如类的方法、构造方法、超类、修饰符、成员变量、常量;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。第46页,共54页,2024年2月25日,星期天4、反射类反射API的基本原理:Java类和运行时对象知道关于它们自己的信息,通常用于开发复杂的应用程序,如JavaBean、可视化开发环境、分布式调试器等。Java反射的类与包主要位于java.lang.reflect包中ObjectProxyMethodFieldArrayConstructorJava.lang.ClassJava.lang.reflect.AccessibleObject…第47页,共54页,2024年2月25日,星期天Object类:反射类和Java类的超类。Object类定义的getClass方法在运行时获取Class类的对象。这个对象提供必需的反射信息。Class类:代表一个类。Field类:类的成员变量。Method类:类的方法。Constructor类:类的构造方法。Array类:提供动态创建数组及访问数组元素的静态方法。第48页,共54页,2024年2月25日,星期天例:从命令行中读取类名,输出其所有方法(args[0]:Java.lang.Thread)importjava.lang.reflect.*;publicclassDumpMethods{publicstaticvoidmain(String[]args)throwsException{//加载并初始化命令行参数指定的类ClassclassType=Class.forName(args[0]);//获取类的所有方法Methodmethod[]=classType.getDeclaredMethods();for(inti=0;i<method.length;i++){System.out.println(method[i].toString());}}}程序运行结果(参数为java.lang.Thread)publicstaticnativejava.lang.Threadjava.lang.Thread.currentThread()privatenativebooleanjava.lang.Thread.isInterrupted(boolean)publicbooleanjava.lang.Thread.isInterrupted()publicvoidjava.lang.Thread.run()privatevoidjava.lang.Thread.exit()privatevoidjava.lang.Thread.dispatchUncaughtException(java.lang.Throwable)privatestaticnativevoidjava.lang.Thread.registerNatives()publicjava.lang.Stringjava.lang.Thre

温馨提示

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

评论

0/150

提交评论