Java语言程序设计基础第八章:异常处理_第1页
Java语言程序设计基础第八章:异常处理_第2页
Java语言程序设计基础第八章:异常处理_第3页
Java语言程序设计基础第八章:异常处理_第4页
Java语言程序设计基础第八章:异常处理_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第八章异常预习检查什么是异常?Java中,如何进行异常处理?如何使用log4j记录日志?本章任务解决计算商时出现的各种问题使用log4j记录日志本章目标使用try-catch-finally处理异常使用throw、throws抛出异常掌握异常及其分类使用log4j记录日志生活中的异常正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!一路畅通堵车!撞车!publicclassTest1{ publicstaticvoidmain(String[]args){ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); System.out.println("感谢使用本程序!"); }}输入:20040输入:B正常情况:异常情况:程序中的异常2-1输入:2000程序中的异常2-2如何解决该问题呢?publicclassTest2{ publicstaticvoidmain(String[]args){ Scannerin=newScanner(System.in); … System.out.print("请输入除数:"); intnum2=0; if(in.hasNextInt()){//如果输入的除数是整数

num2=in.nextInt(); if(0==num2){//如果输入的除数是0 System.err.println("输入的除数是0,程序退出。"); System.exit(1); } }else{//如果输入的除数不是整数

System.err.println("输入的除数不是整数,程序退出。"); System.exit(1); } … }}尝试通过if-else来解决异常问题,可行吗?不可行!!1、代码臃肿

2、程序员要花很大精力"堵漏洞“3、程序员很难堵住所有“漏洞”如果由Java系统来堵漏洞,那程序员就轻松多了!Java就是这么做的!异常机制什么是异常异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序绕行或者等待请求交警解决异常!面对异常该怎么办呢?通常情况下,我们会这样处理:程序运行程序中断运行堵车!撞车!生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活什么是异常处理Java编程语言使用异常处理机制为程序提供了错误处理的能力程序中预先想好了对付异常的处理办法异常!程序运行处理完毕,程序继续运行对异常进行处理Java中如何进行异常处理Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws

捕获异常catchtryfinally执行可能产生异常的代码捕获异常无论是否发生异常,代码总能执行手动抛出异常抛出异常throw声明异常声明方法可能要抛出的各种异常throwstrycatchtry-catch块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型ex){//对异常进行处理的代码段}//代码段}try-catch块7-1使用try-catch块捕获异常,分为三种情况:第一种情况publicclassTest3{ publicstaticvoidmain(String[]args){

try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); System.out.println("感谢使用本程序!");

}catch(Exceptione){ System.err.println("出现错误:被除数和除数必须是整数, "+ "除数不能为零。");

e.printStackTrace();

} }}try-catch块7-2使用示例模拟第一种情况:输入:200,40trycatch异常类型匹配try-catch块后的代码段进入catch块publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}try-catch块7-3使用try-catch块捕获异常,分为三种情况:第二种情况产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类

发生异常publicclassTest3{ publicstaticvoidmain(String[]args){

try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); System.out.println("感谢使用本程序!");

}catch(Exceptione){ System.err.println("出现错误:被除数和除数必须是整数," + "除数不能为零。");

e.printStackTrace();

} }}try-catch块7-4使用示例模拟第二种情况:输入:B输入:200,0try-catch块7-5printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:840)atjava.util.Scanner.next(Scanner.java:1461)atjava.util.Scanner.nextInt(Scanner.java:2091)atjava.util.Scanner.nextInt(Scanner.java:2050)atcn.jbit.exception.Test3.main(Test3.java:15)异常类型异常堆栈信息在此方法中抛出了异常出现异常的位置trycatch异常类型不匹配try-catch块后的代码段程序中断运行

发生异常publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}try-catch块7-6使用try-catch块捕获异常,分为三种情况:第三种情况产生异常对象try-catch块7-7方法名说明voidprintStackTrace()输出异常的堆栈信息StringgetMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分在catch块中处理异常加入用户自定义处理信息调用异常对象的方法输出异常信息e.printStackTrace();System.err.println("出现错误:被除数和除数必须是整数, "+ "除数不能为零。");常见的异常类型方法名说明Exception异常层次结构的根类ArithmeticException算术错误情形,如以零作除数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问null对象成员ClassNotFoundException不能加载所需的类InputMismatchException欲得到数据类型与实际输入类型不匹配IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常,如把"abc"转换成数字try-catch-finally3-1在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行try块finally块catch块无异常有异常publicclassTest4{ publicstaticvoidmain(String[]args){ try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); }catch(Exceptione){ System.err.println(“出现错误:被除数和除数必须是整数," +"除数不能为零。"); System.out.println(e.getMessage()); }finally{ System.out.println("感谢使用本程序!"); } }}try-catch-finally3-2输入:20040输入:2000第一种情况:无异常第二种情况:有异常try-catch-finally3-3finally块中语句不执行的唯一情况异常处理代码中执行System.exit(1)退出Java虚拟机publicclassTest5{ publicstaticvoidmain(String[]args){ try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); }catch(Exceptione){ System.err.println("出现错误:被除数和除数必须是整数," + "除数不能为零");

System.exit(1);//finally语句块不执行的唯一情况

}finally{

System.out.println("感谢使用本程序!"); } }}publicvoidmethod(){try{//代码段

//产生异常(异常类型2)}catch(异常类型1ex){//对异常进行处理的代码段}catch(异常类型2ex){//对异常进行处理的代码段}catch(异常类型3ex){//对异常进行处理的代码段}//代码段}多重catch块2-1一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句执行其中一条catch语句后,其后catch语句将被忽略try

与异常类型1不匹配try-catch块后的代码段发生异常产生异常对象catch与异常类型2匹配catchcatch程序继续执行进入catch块多重catch块2-2publicclassTest6{ publicstaticvoidmain(String[]args){ try{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); }catch(InputMismatchExceptione)

{ System.err.println("被除数和除数必须是整数。");

}catch(ArithmeticExceptione){ System.err.println("除数不能为零。");

}catch(Exceptione){ System.err.println("其他未知异常。");

}

… }}输入:B进入第一个catch块输入:2000进入第二个catch块在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类声明异常Java语言中通过throws声明某个方法可能抛出的各种异常可以同时声明多个异常,之间由逗号隔开publicclassTest7{ publicstaticvoiddivide()

throwsException{ Scannerin=newScanner(System.in); System.out.print("请输入被除数:"); intnum1=in.nextInt(); System.out.print("请输入除数:"); intnum2=in.nextInt(); System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2)); } publicstaticvoidmain(String[]args){

try{

divide();

}catch(Exceptione){ e.printStackTrace();

} }// publicstaticvoidmain(String[]args)throwsException{// divide();// }}divide()方法没有处理异常,而是声明异常方式1:调用者通过try-catch捕获并处理异常

方式2:调用者通过throws继续声明异常

抛出异常除了系统自动抛出异常外,有些问题需要程序员自行抛出异常publicclassPerson{ privateStringname="";//姓名

privateintage=0;//年龄

privateStringsex="男";//性别

publicvoidsetSex(Stringsex)throwsException{ if("男".equals(sex)||"女".equals(sex)) this.sex=sex; else{

thrownewException("性别必须是“男”或者“女”!"); } } publicvoidprint(){ System.out.println(+"("+this.sex +","+this.age+"岁)"); }}publicclassTest8{ publicstaticvoidmain(String[]args){ Personperson=newPerson();

try{ person.setSex("Male"); person.print();

}catch(Exceptione){

e.printStackTrace();

} }}抛出异常捕获异常,或者throws异常异常的分类2-1仅靠程序本身无法恢复的严重错误

Exception和Error类的父类由Java应用程序抛出和处理的非严重错误

运行时异常,不要求程序必须对它们做出处理

Checked异常,程序必须处理该类异常异常的分类2-2publicclassTest9{ publicstaticvoidmain(String[]args){ FileInputStreamfis=null; //创建指定文件的流。

fis=newFileInputStream(newFile("accp.txt")); //关闭指定文件的流。

fis.close(); }}两种异常均为Checked异常,必须进行处理publicclassTest10{ publicstaticvoidmain(String[]args){ FileInputStreamfis=null;

try{

fis=newFileInputStream(newFile("accp.txt"));

}catch(FileNotFoundExceptione){ System.err.println("无法找到指定文件!");

}

try{ fis.close();

}catch(IOExceptione){ System.err.println("关闭指定文件输入流时出现异常!");

} }}异常处理原则将异常用于非正常情况按异常的具体类型捕获异常采用不同措施处理异常按照从特殊到一般的顺序处理异常开源日志记录工具log4j希望以文件记录异常信息,甚至记录程序正常运行的关键步骤信息,而不是在控制台上输出,这种情况该如何处理呢?使用流行的开源日志记录工具-log4j来实现日志及分类日志(log)主要用来记录系统运行中一些重要操作信息便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因日志分类 SQL日志、异常日志、业务日志log4j是一个非常优秀的开源日志记录工具控制日志的输出级别控制日志信息输送的目的地是控制台、文件等控制每一条日志的输出格式如何使用log4j记录日志5-1第一步:在项目中加入log4j所使用的JAR文件如何使用log4j记录日志5-2第二步:创建perties文件如何使用log4j记录日志5-3第三步:编写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,那么使用debu

温馨提示

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

评论

0/150

提交评论