Java 语言编程技术6.pdf
Java语言编程技术Cht 6 EHdliCht 6 EHdliChapter6:Error Handling Chapter6:Error Handling ith Etiith Etiwith Exceptionswith Exceptions主要内容 什么是什么是exceptionexception exceptionexception的捕获和处理的捕获和处理 exceptinexceptin的分类的分类 exceptinexceptin的分类的分类 自定义自定义exceptionexceptionJava 语言编程技术2什么是exception?divide by zerodivide by zero 试图打开的文件不存在试图打开的文件不存在 网络连接被中断网络连接被中断 网络连接被中断网络连接被中断 操作数组越界操作数组越界 正在装载的类丢失时;正在装载的类丢失时;Java 语言编程技术3出现exception怎么办?p 创建并抛出一个创建并抛出一个exceptionexception对象对象创建并抛出个创建并抛出个exceptionexception对象对象 中断正常执行中断正常执行由由处处 由由exception handlerexception handler处理处理exceptionexceptiontry try/Code that might generate exceptions/Code that might generate exceptions/Code that might generate exceptions/Code that might generate exceptionsif(t=null)if(t=null)throwthrow new NullPointerException();new NullPointerException();catch()catch()Java 语言编程技术4catch()catch()exception的捕获和处理ptry/Code that might generate exceptions将正常将正常/Code that might generate exceptions catch(ExceptionType1 eid1)将正常将正常处理与处理与(pyp)/Handle exceptions of Type1/Handle exceptions of Type1错误处错误处理分开理分开 catch(ExceptionType2 eid2)/Handle exceptions of Type2/Handle exceptions of Type2理分开理分开/Handle exceptions of Type2/Handle exceptions of Type2 finally y/Java 语言编程技术5exception分类Java 语言编程技术6exception分类 RuntimeExceptionRuntimeExceptionArithmeticExceptionArithmeticExceptionNullPointerExceptionNullPointerExceptionNullPointerExceptionNullPointerExceptionClassCastExceptionClassCastExceptionNegativeArraySizeExceptionNegativeArraySizeExceptionIndexOutOfBoundsExceptionIndexOutOfBoundsExceptionIndexOutOfBoundsExceptionIndexOutOfBoundsExceptionJava 语言编程技术7exception分类 非非RuntimeException RuntimeException 必须处理必须处理ClassNotFoundExceptionClassNotFoundExceptionCloneNotSupportedExceptionCloneNotSupportedExceptionCloneNotSupportedExceptionCloneNotSupportedExceptionInterruptedExceptionInterruptedExceptionIOExceptionIOException Java 语言编程技术8自定义exception 从已有定义的从已有定义的exceptionexception类继承,类继承,一般继一般继从已有定义的从已有定义的e cept oe cept o 类继承,类继承,般继般继承承ExceptionException类类 例:例:c10:SimpleExceptionDemo.javac10:SimpleExceptionDemo.javappjppj 例:例:c10:FullConstructors.java c10:FullConstructors.java 带参数的构造方法带参数的构造方法带参数的构造方法带参数的构造方法 例:例:ExtraFeatures.javaExtraFeatures.javaJava 语言编程技术9例例j jexception说明void f()void f()throwsthrows TooBig,TooSmall,DivZero TooBig,TooSmall,DivZero/可能有可能有i i././可能有可能有ExceptionException 方法声明时必须指明可能产生的方法声明时必须指明可能产生的 ExceptionException,否则编译错误否则编译错误 声明产生声明产生ExceptionException也可以不产生也可以不产生 声明产生声明产生ExceptionException,也可以不产生也可以不产生Exception Exception 子类可能产生子类可能产生Java 语言编程技术10Throwable方法Throwable方法 toString()toString()toString()toString()getMessage()getMessage()getLocalizedMessage()getLocalizedMessage()printStackTrace()printStackTrace()printStackTrace()printStackTrace()printStackTrace(PrintStream s)printStackTrace(PrintStream s)printStackTrace(PrintWriter s)printStackTrace(PrintWriter s)fillInStackTrace()fillInStackTrace()fillInStackTrace()fillInStackTrace()例:例:c10:ExceptionMethods.javac10:ExceptionMethods.javaJava 语言编程技术11Rethrowing an exceptiongpcatch(Exception e)Sti tl(Atith)System.err.println(An exception was thrown);throw e;fillInStackTrace()fillInStackTrace()更新信息更新信息public Throwable fillInStackTrace()public Throwable fillInStackTrace()例:例:10 R thij10 R thij例:例:c10:Rethrowing.javac10:Rethrowing.javaJava 语言编程技术12finally 无论是否有无论是否有exceptionexception都要执行都要执行例:例:c10:FinallyWorks.javac10:FinallyWorks.javac10:OnOffSwitch javac10:OnOffSwitch javac10:OnOffSwitch.javac10:OnOffSwitch.javac10:WithFinally.javac10:WithFinally.java 缺陷:缺陷:finallyfinally中抛出的中抛出的exceptionexception未被捕获未被捕获例:例:c10:LostMessage javac10:LostMessage java例:例:c10:LostMessage.javac10:LostMessage.javaJava 语言编程技术13方法重写与exceptionp 子类重写父类方法时,只能抛出父类方法所抛子类重写父类方法时,只能抛出父类方法所抛出的出的exceptionexception或其子类或其子类出的出的exceptionexception或其子类或其子类 父类方法父类方法父类方法父类方法 throw IOException throw IOException 子类方法子类方法 throw FileNotFoundExceptionthrow FileNotFoundExceptionthrow Exceptionthrow Exception 子类方法可以抛出部分子类方法可以抛出部分exceptionexception 子类方法可以抛出部分子类方法可以抛出部分exception exception 子类方法不能抛出新的子类方法不能抛出新的exceptionexception例例ijij 例:例:c10:StormyInning.javac10:StormyInning.javaJava 语言编程技术14方法重写与exception 子类的构造方法子类的构造方法 可以抛出更多可以抛出更多exceptionexception 子类构造方法中不能捕获基类构造方法子类构造方法中不能捕获基类构造方法 子类构造方法中不能捕获基类构造方法子类构造方法中不能捕获基类构造方法中抛出的中抛出的exceptionexceptionJava 语言编程技术15catch匹配规则 exceptionexception与与catchcatch参数参数类型相同或者为类型相同或者为try 类型相同,或者为类型相同,或者为catchcatch参数类的子类参数类的子类/catch(Type1 id1)按先后顺序,只捕获按先后顺序,只捕获一次一次 catch(Type1 id1)/次次先具体、后一般先具体、后一般 catch(Type2 id2)/例:例:c10:Human javac10:Human java/finally 例:例:c10:Human.javac10:Human.java/Java 语言编程技术16上机作业 自定义两个自定义两个exceptionexception类类 编写一段程序使用这两个类:从标准输编写一段程序使用这两个类:从标准输入读入字符串,当字符串为空时抛出一入读入字符串,当字符串为空时抛出一入读入字符串,当字符串为空时抛出入读入字符串,当字符串为空时抛出个个exceptionexception,当字符串包含阿拉伯数字当字符串包含阿拉伯数字时抛出另一个时抛出另一个exceptionexception;捕获捕获exceptionexception时抛出另一个时抛出另一个exceptionexception;捕获捕获exceptionexception。Java 语言编程技术17