异常NIIT培训铸就辉煌IT人生目标:Java异常的概念和分类Java异常处理机制用户自定义异常生活中的异常正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!一路畅通堵车!撞车!程序中的异常如何解决该问题呢?尝试通过if-else来解决异常问题,可行吗?不可行!!1、代码臃肿2、程序员要花很大精力堵漏洞“3、程序员很难堵住所有“漏洞”如果由Java系统来堵漏洞,那程序员就轻松多了!Java就是这么做的!异常机制什么是异常异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序面对异常该怎么办呢?通常情况下,我们会这样处理:绕行或者等待请求交警解决异常!程序运行程序中断运行堵车!撞车!生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活什么是异常处理Java编程语言使用异常处理机制为程序提供了错误处理的能力程序中预先想好了对付异常的处理办法异常!程序运行处理完毕,程序继续运行对异常进行处理Java中如何进行异常处理Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws捕获异常catchtryfinally执行可能产生异常的代码捕获异常无论是否发生异常,代码总能执行手动抛出异常抛出异常throw声明异常声明方法可能要抛出的各种异常throwstry-catch块(1)使用try-catch块捕获异常,分为三种情况:trycatchtry-catch块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型ex){//对异常进行处理的代码段}//代码段}第一种情况try-catch块(2)trycatch异常类型匹配try-catch块后的代码段publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}第二种情况产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类try-catch块(3)printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程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)异常类型异常堆栈信息在此方法中抛出了异常出现异常的位置try-catch块(4)trycatch异常类型不匹配try-catch块后的代码段程序中断运行发生异常publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}第三种情况产生异常对象try-catch块(5)在catch块中处理异常加入用户自定义处理信息调用异常对象的方法输出异常信息e.printStackTrace();System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);方法名说明voidprintStackTrace()输出异常的堆栈信息StringgetMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分常见的异常类型try-catch-finally在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行finally块中语句不执行的唯一情况异常处理代码中执行System.exit(1)退出Java虚拟机try块finally块catch块无异常有异常多重catch块一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句执行其中一条catch语句后,其后catch语句将被忽略publicvoidmethod(){try{//代码段//产生异常(异常类型2)}catch(异常类型1ex){//对异常进行处理的代码段}catch(异常类型2ex){//对异常进行处理的代码段}catch(异常类型3ex){//对异常进行处理的代码段}//代码段}try与异常类型1不匹配try-catch块后的代码段发生异常产生异常对象catch与异常类型2匹配catchcatch程序继续执行声明、抛出异常使用throws声明异常:如果一个方法中的代码在运行时可能生成某种异常,但在本方法中不必、或者不能确定如何处理此类异常时,则可以声明抛弃该异常;此时方法中将不对此类异常进行处理,而是由该方法的调用者负责处理。人工抛出异常:Java异常类对象除了在程序运行出错时由系统自动生成并抛出之外,也可根据需要人工创建并抛出:IOExceptione=newIOException();throwe;被抛出的必须是Throwable或其子类类型的对象,下述语句在编译时会产生语法错误:thrownewString(wanttothrow);用户自定义异常(1)Java语言针对常见异常状况已事先定义了相应的异常类型,并在程序运行出错时由系统自动创建相应异常对象并进行抛出、捕获和处理,因此一般不需要用户人工抛出异常对象或定义新的异常类型。针对特殊的需要也可以这样做:用户自定义异常(2)publicclassMyExceptionextendsException{privateintidnumber;publicMyException(Stringmessage,intid){super(message);this.idnumber=id;}publicintgetId(){returnidnumber;}}publicclassTestCustomizingException{publicvoidregist(intnum)throwsMyException{if(num0){thrownewMyException(人数为负值,不合理,3);}System.out.println(登记人数:+num);}publicvoidmanager(){try{regist(-100);}catch(MyExceptione){System.out.println(登记失败,出错种类+e.getId());}System.out.print(本次登记操作结束);}publicstaticvoidmain(Stringargs[]){newTestCustomizingException().manager();}}异常的分类仅靠程序本身无法恢复的严重错误Exception和Error类的父类由Java应用程序抛出和处理的非严重错误运行时异常,不要求程序必须对它们做出处理Checked异常,程序必须处理该类异常总结异常(Exception)是程序运行过程中发生的事件,该事件可以中断程序指令的正常执行流程。Java异常分为两大类:错误(Error)是指JVM系统内部错误、资源耗尽等严重情况;违例(Exception)则是指其他因编程错误或偶然的外在因素导致的一般性问题,例如对负数开平方根、空指针访问、试图读取不存在的文件以及网络连接中断等。