实验8异常处理log4j反射与内部类.docx
- 文档编号:4358908
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:12
- 大小:21.40KB
实验8异常处理log4j反射与内部类.docx
《实验8异常处理log4j反射与内部类.docx》由会员分享,可在线阅读,更多相关《实验8异常处理log4j反射与内部类.docx(12页珍藏版)》请在冰豆网上搜索。
实验8异常处理log4j反射与内部类
实验8异常处理、log4j、反射与内部类
一、实验目的
1、理解异常的概念,熟悉异常的分类、Exception类、Java的异常处理机制及声明抛出异常、自定义异常的方法;
2、熟悉log4j的基本用法;
3、理解反射的概念,熟悉反射中常用类的基本用法;
4、理解内部类的概念,熟悉成员内部类和局部内部类的基本用法。
二、实验步骤
1、(基础题)下图是一程序运行的结果,请根据程序代码和注释填空,并回答问题:
程序代码:
//打印该类公有方法的返回类型、名称和参数列表
importjava.lang.reflect.Method;
classMyClass6{
publicvoidgetData(inta,floatb,Strings){
}
publicvoidputData(inta,intb){
}
}
publicclassClassMethodExample{
publicstaticvoidmain(String[]args){
MyClass6myObj=newMyClass6();
displayMethods(myObj);
}
staticvoiddisplayMethods(Objectobj){
intcount=0;
Class
extendsObject>c1=obj.getClass();
Method[]stringMethods=c1.getMethods();
while(count StringmethodName=stringMethods[count].getName(); Class >returnType=stringMethods[count].getReturnType(); System.out.print(returnType+""+methodName+"("); Class[]parameterTypes=stringMethods[count].getParameterTypes(); for(inti=0;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)该程序的内部类是什么? 其访问权限怎样? 有哪些属性和方法? 构造方法具有什么功能? 内部类是Course类,私有访问权限,属性: String[]strCourse;courseNumber 方法: publicCourse(String[]course)(构造方法,初始化属性) privatevoidgetCourse()(获得并且输出课程名) privatevoidgetDescription()(设置课程,并且输出) 2)该程序的外部类是什么? Student缺省 3)内部类与外部类之间是怎样联系的? 内部类实例是在哪里创建的? 部类与外部类之间通过publicvoidsetStudentCourse(String[]strCourse) 方法联系,在publicvoidsetStudentCourse(String[]strCourse) { newCourse(strCourse); }方法中创建实例 4)内部类编译后形成的类文件是如何命名的? Student$Course 3、(基础题)根据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("程序执行完! "); } } } 程序运行结果如下: 程序执行完! Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException: 0 atpa.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+inc>MAX_V){ //抛出MotorException异常实例,提示”发动机将被毁坏! ” ____thrownewMotorException("发动机将被毁坏! ")____; }else{ speed+=inc; } } } publicclassLab6_5{ publicstaticCarcar; publicstaticvoidmain(Stringargs[]){ car=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()); }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.ConsoleAppender log4j.appender.A.Target=System.err log4j.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.FileAppender log4j.appender.B.File=jbit.log log4j.appender.B.layout=org.apache.log4j.PatternLayout log4j.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完成以下功能: (1)查询余额 (2)取款(3)存款(4)退出 在控制台上模拟上述菜单,系统根据用户所选择的数字进行相应的功能。 如果所选数字不是以上1-4之间通知重新输入。 当用户取款的金额超出帐户余额抛出自定义异常,通知重新输入金额。 当用户选择4时整个系统退出。 运行效果如下所示: (主类名字必须改,否则运行出错) 1)显示余额2)取款3)存款4)退出 PressNo.: 1 帐户余额为: 1000.0 1)显示余额2)取款3)存款4)退出 PressNo.: 2 请输入取款金额100 1)显示余额2)取款3)存款4)退出 PressNo.: 1 帐户余额为: 900.0 1)显示余额2)取款3)存款4)退出 PressNo.: 2 请输入取款金额1200 余额不足 1)显示余额2)取款3)存款4)退出 PressNo.: 4 系统退出! 请认真阅读下面的代码并回答如下问题: (1)自定义异常类BankException继承了什么类? 能不能换成其他的类? 为什么? (2)类Bank的menu()方法的功能是什么? menu()方法里调用了哪些方法? (3)在取款方法deposit()里声明了哪些异常? 当余额不足时,又重新抛出了哪个异常? importjava.io.*; //主程序: publicclassMyException{ publicstaticvoidmain(String[]args){ Bankmy=newBank(1000.0); //菜单 while(true){ Bank.menu(my); } } } //定义自定义异常类.抛出该异常条件: 取款金额超出帐户余额 classBankExceptionextendsException{ voiddisp(){ System.out.println("余额不足"); } } classBank{ doubleaccount;//余额 Bank(doubledl){ account=dl; } staticvoidmenu(Bankobj){ System.out.println("1)显示余额2)取款3)存款4)退出"); System.out.print("PressNo.: "); switch(getChoice()){ case1: obj.disp();//余额显示 break; case2: try{ obj.deposit();//取款 }catch(BankExceptione){ e.disp(); }catch(IOExceptione){ e.printStackTrace(); } break; case3: obj.saving();//存款 break; case4: System.out.println("系统退出! "); System.exit(0); default: System.out.println("重新选择! "); } } staticintgetChoice(){//选择功能数字 intchoice=0; try{ BufferedReaderbr=newBufferedReader(newInputStreamReader( System.in)); choice=Integer.parseInt(br.readLine()); }catch(IOExceptione){ e.printStackTrace(); } returnchoice; } //存款 voidsaving(){ doubletrans_account; //输入存款金额 System.out.print("请输入存款金额"); try{ BufferedReaderbr=newBufferedReader(newInputStreamReader( System.in)); trans_account=Double.parseDouble(br.readLine()); account+=trans_account; }catch(IOExceptione){ e.printStackTrace(); } } //取款 voiddeposit()throwsBankException,IOException{ doubletrans_account; System.out.print("请输入取款金额"); try{ BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)); trans_account=Double.parseDouble(br.readLine()); //判断余额 if(account>trans_account){ account-=trans_account; }else thrownewBankException();//抛出异常 }catch(IOExceptione){ e.printStackTrace(); } } //打印余额 voiddisp(){ System.out.println("帐户余额为: "+account); } } 运行结果如下: 1)显示余额2)取款3)存款4)退出 PressNo.: 1 帐户余额为: 1000.0 1)显示余额2)取款3)存款4)退出 PressNo.: 2 请输入取款金额100 1)显示余额2)取款3)存款4)退出 PressNo.: 1 帐户余额为: 900.0 1)显示余额2)取款3)存款4)退出 PressNo.: 2 请输入取款金额1200 余额不足 1)显示余额2)取款3)存款4)退出 PressNo.: 4 系统退出!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验8 异常处理log4j反射与内部类 实验 异常 处理 log4j 反射 部类