1实验8异常处理、log4j、反射与内部类一、实验目的1、理解异常的概念,熟悉异常的分类、Exception类、Java的异常处理机制及声明抛出异常、自定义异常的方法;2、熟悉log4j的基本用法;3、理解反射的概念,熟悉反射中常用类的基本用法;4、理解内部类的概念,熟悉成员内部类和局部内部类的基本用法。二、实验步骤1、(基础题)下图是一程序运行的结果,请根据程序代码和注释填空,并回答问题:程序代码://打印该类公有方法的返回类型、名称和参数列表importjava.lang.reflect.Method;classMyClass6{publicvoidgetData(inta,floatb,Strings){}publicvoidputData(inta,intb){}}2publicclassClassMethodExample{publicstaticvoidmain(String[]args){MyClass6myObj=newMyClass6();displayMethods(myObj);}staticvoiddisplayMethods(Objectobj){intcount=0;Class?extendsObjectc1=obj.getClass();Method[]stringMethods=c1.getMethods();while(countstringMethods.length){StringmethodName=stringMethods[count].getName();Class?returnType=stringMethods[count].getReturnType();System.out.print(returnType++methodName+();Class[]parameterTypes=stringMethods[count].getParameterTypes();for(inti=0;iparameterTypes.length;i++){StringparameterName=parameterTypes[i].getName();System.out.print(+parameterName);}count++;System.out.println(););}}}问题:1)该程序的实现功能是什么?打印该类公有方法的返回类型、名称和参数列表2)请解释一下运行结果前三行各代表什么含义?voidgetData(intfloatjava.lang.String);代表getData方法返回类型、名称和参数列表voidputData(intint);代表putData方法返回类型、名称和参数列表voidwait(longint);代表wait方法返回类型、名称和参数列表2、(基础题)分析、运行所给的Student.java程序,并回答下列问题:1)该程序的内部类是什么?其访问权限怎样?有哪些属性和方法?构造方法具有什么功能?3内部类是Course类,私有访问权限,属性:String[]strCourse;courseNumber方法:publicCourse(String[]course)(构造方法,初始化属性)privatevoidgetCourse()(获得并且输出课程名)privatevoidgetDescription()(设置课程,并且输出)2)该程序的外部类是什么?Student缺省3)内部类与外部类之间是怎样联系的?内部类实例是在哪里创建的?部类与外部类之间通过publicvoidsetStudentCourse(String[]strCourse)方法联系,在publicvoidsetStudentCourse(String[]strCourse){newCourse(strCourse);}方法中创建实例4)内部类编译后形成的类文件是如何命名的?Student$Course3、(基础题)根据catch子句处理异常所输出的信息的提示,请在下面程序(1)、(2)、(2)处填入适当的代码:publicclassLab6_4{publicstaticvoidmain(Stringargs[]){try{intx=68;inty=Integer.parseInt(args[0]);intz=x/y;System.out.println(x/y的值是+z);}catch(___ArrayIndexOutOfBoundsExceptione___){System.out.println(缺少命令行参数。+e);}catch(______NumberFormatExceptione_____){System.out.println(参数类型不正确。+e);}catch(________ArithmeticExceptione______){System.out.println(算术运算错误。+e);}finally{System.out.println(程序执行完!);}4}}程序运行结果如下:程序执行完!Exceptioninthreadmainjava.lang.ArrayIndexOutOfBoundsException:0atpa.Lab6_4.main(Lab6_4.java:7)有用提示:(1)ArithmeticException:除数为0时的算术异常(2)NullPointerException:没有给对象分配内存空间,而又去访问对象的空指针异常(3)FileNotFoundException:找不到文件的异常(4)ArrayIndexOutOfBoundsException:数组元素下标越界异常(5)NumberFormatException:数据格式不正确异常请模仿不同异常情况予以执行。4、(基础题)下面是一个自定义异常类调用的程序,请根据程序上下文填充所缺内容://自定义异常类MotorException,它继承了Exception类classMotorExceptionextendsException{publicMotorException(){super();}publicMotorException(Strings){super(s);}}classCar{privatefloatspeed=0;privatefloatMAX_V=300;//说明调用该方法可能抛出MotorException异常publicvoidaccelerate(floatinc)_throwsMotorException__{if(speed+incMAX_V){//抛出MotorException异常实例,提示”发动机将被毁坏!”____thrownewMotorException(发动机将被毁坏!)____;}else{speed+=inc;}}}publicclassLab6_5{publicstaticCarcar;publicstaticvoidmain(Stringargs[]){5car=newCar();_try___{//可能引发异常的块for(;;)car.accelerate(0.5f);}___catch____(MotorExceptionme){//捕获、处理异常System.out.println(Mechanicalproblem:+me);}}}程序运行结果:Mechanicalproblem:pa.MotorException:发动机将被毁坏!5、(基础题)先加载log4j的jar包,再分析、运行下列程序,休会log4j的基本用法,并回答相关问题。importjava.util.InputMismatchException;importjava.util.Scanner;importorg.apache.log4j.Logger;publicclassTest{privatestaticLoggerlogger=Logger.getLogger(Test.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());6}finally{System.out.println(欢迎使用本程序!);}}}###\u8BBE\u7F6ELogger\u8F93\u51FA\u7EA7\u522B\u548C\u8F93\u51FA\u76EE\u7684\u5730###log4j.rootLogger=debug,A,B###\u628A\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u63A7\u5236\u53F0###log4j.appender.A=org.apache.log4j.ConsoleAppenderlog4j.appender.A.Target=System.errlog4j.appender.A.layout=org.apache.log4j.SimpleLayout###\u628A\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u6587\u4EF6\uFF1Ajbit.log###log4j.appender.B=org.apache.log4j.FileAppenderlog4j.appender.B.File=jbit.loglog4j.appender.B.layout=org.apache.log4j.PatternLayoutlog4j.appender.B.layout.ConversionPattern=%d{YYYY-MM-DDHH:mm:ss}%l%F%p%m%n问题:1)log4j将信息分为多少个级别?五大级别2)怎样设置才能将错误信息在屏幕上显示?配置log4j.properties把日志信息输出到控制台3)怎样设置才能将错误信息在文件中输出?配置log4j.properties把日志信息输出到文件6、(提高题)模拟银行ATM完成以下功能:7(1)查询余额(2)取款(3)存款(4)退出在控制台上模拟上述菜单,系统根据用户所选择的数字进行相应的功能。如果所选数字不是以上1-4之间通知重新输入。当用户取款的金额超出帐户余额抛出自定义异常,通知重新输入金额。当用户选择4时整个系统退出。运行效果如下所示:(主类名字必须改,否则运行出错)请认真阅读下面的代码并回答如下问题:(1)自定义异常类BankException继承了什么类?能不能换成其他的类?为什么?(2)类Bank的menu()方法的功能是什么?menu()方法里调用了哪些方法?(3)在取款方法deposit()里声明了哪些异常?当余额不足时,又重新抛出了哪个异常?importjava.io.*;//主程序:publicclassMyException{publi