资源描述
Hands-On实训教程系列实训教程系列猜字游戏猜字游戏 Hands-On实训教程系列实训教程系列教学目标教学目标l了解编程中遇到的错误了解编程中遇到的错误l理解理解Java异常及异常及Java异常处理机制异常处理机制l掌握自定义异常的使用掌握自定义异常的使用l掌握掌握throw与与throws的区别的区别l能熟练使用能熟练使用try-catch-finlly进行异常处理进行异常处理l通过实现加法计算器功能掌握通过实现加法计算器功能掌握Java的异常处的异常处理理 Hands-On实训教程系列实训教程系列演示程序演示程序l演示程序演示程序 Hands-On实训教程系列实训教程系列相关实践相关实践1l打开打开netBeans5.5,新建,新建guessNumber应用应用程序程序,l在项目中加入包在项目中加入包com.handson.guessNumber Hands-On实训教程系列实训教程系列相关实践相关实践2l新建类新建类NumberException类类,用来生成自定,用来生成自定义义异常异常 package com.handson.guessNumber;public class NumberException extends Exception public NumberException()super(输入的不是一个输入的不是一个100以内的正整数!以内的正整数!);Hands-On实训教程系列实训教程系列相关实践相关实践3l在在com.handson.guessNumber包中新建类包中新建类Tools public class Tools public static boolean chick(String temp)throws NumberException int number=Integer.parseInt(temp);if(number=100)throw new NumberException();if(number=65)return true;else return false;Hands-On实训教程系列实训教程系列相关实践相关实践4l新建类新建类Main,用来测试,用来测试 public class Main public static void main(String args)boolean b=false;System.out.println(一个数字游戏一个数字游戏);System.out.println(请看下面的数字,判断最后一个数字是什么?请看下面的数字,判断最后一个数字是什么?);System.out.println(5,9,17,33,?);System.out.println(答案要是一个正整数!答案要是一个正整数!);System.out.println(请输入答案请输入答案);Hands-On实训教程系列实训教程系列相关实践相关实践5l继续继续main函数中的代码函数中的代码 try BufferedReader reader=new BufferedReader(new InputStreamReader(System.in);String answer=reader.readLine();b=Tools.chick(answer);catch(IOException ex)System.out.println(没有输入!没有输入!);ex.printStackTrace();catch(java.lang.NumberFormatException ex)System.out.println(输入的不是数字输入的不是数字);System.out.println(ex.getMessage();ex.printStackTrace();catch(NumberException ex)System.out.println(ex.getMessage();123 Hands-On实训教程系列实训教程系列相关实践相关实践6l继续继续main函数中的代码函数中的代码finally if(b)System.out.println(回答的非常正确!回答的非常正确!);else System.out.println(回答不正确!回答不正确!);Hands-On实训教程系列实训教程系列相关实践相关实践7l运行输入非数字运行输入非数字 Hands-On实训教程系列实训教程系列相关实践相关实践8l运行输入不在运行输入不在0-100之间的数字之间的数字 Hands-On实训教程系列实训教程系列相关实践相关实践9l输入正确答案的结果输入正确答案的结果 Hands-On实训教程系列实训教程系列总结总结l异常是运行时发生的错误异常是运行时发生的错误l可以使用可以使用 try、catch、throw、throws 和和 finally 来来管理管理 Java 异常处理。要监控的程序语句包含在异常处理。要监控的程序语句包含在 try 块内块内catch 块中的代码用于捕获和处理异常。在方法块中的代码用于捕获和处理异常。在方法返回之前绝对必须执行的代码应放置在返回之前绝对必须执行的代码应放置在 finally 块中块中l要手动引发异常,使用关键字要手动引发异常,使用关键字 throw。任何被抛到。任何被抛到方法外部的异常都必须用方法外部的异常都必须用 throws 子句指定子句指定l自定义异常的编写和使用自定义异常的编写和使用 Hands-On实训教程系列实训教程系列编程中的错误编程中的错误l编译错误编译错误编译错误是由于所编写的程序存在语法问题,未能通过由编译错误是由于所编写的程序存在语法问题,未能通过由源代码到目标码(源代码到目标码(Java语言中由源代码到字节码)的编译语言中由源代码到字节码)的编译过程而产生的,它由语言的编译系统负责检测和报告过程而产生的,它由语言的编译系统负责检测和报告;l系统运行错误系统运行错误系统运行错误是指程序在执行过程中发生的错误,它会中系统运行错误是指程序在执行过程中发生的错误,它会中断程序的正常执行断程序的正常执行;l逻辑运行错误逻辑运行错误没有了编译错误和系统运行错误没有了编译错误和系统运行错误,还有可能有逻辑运行错误还有可能有逻辑运行错误,逻辑运行错误是指程序不能实现编程人员的设计意图和设逻辑运行错误是指程序不能实现编程人员的设计意图和设计功能而产生的错误,例如排序时不能正确排序。计功能而产生的错误,例如排序时不能正确排序。Hands-On实训教程系列实训教程系列异常异常l异常(异常(Exception)=非正常非正常l异常不同于错误异常不同于错误举例:到举例:到C盘找不存在的文件盘找不存在的文件l异常是需要处理的异常是需要处理的 Hands-On实训教程系列实训教程系列lJava语言特定的运行错误处理机制语言特定的运行错误处理机制 异常对象异常对象异常抛出异常抛出异常抛出异常抛出异常类处理机制异常类处理机制 Hands-On实训教程系列实训教程系列异常类异常类l异常类包括:异常类包括:java定义的异常类定义的异常类自定义异常类自定义异常类lJava中定义了很多异常类,每个异常类都代中定义了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的表了一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当信息和处理错误的方法等内容。每当Java程程序运行过程中发生一个可识别的运行错误时,序运行过程中发生一个可识别的运行错误时,系统都会产生一个相应的该异常类的对象,即系统都会产生一个相应的该异常类的对象,即产生一个异常产生一个异常 Hands-On实训教程系列实训教程系列系统定义的运行异常系统定义的运行异常异常异常说明说明RuntimeException java.lang包中多数异常的基类包中多数异常的基类 ArithmeticException 算术错误,如除以算术错误,如除以0 IllegalArgumentException 方法收到非法参数方法收到非法参数 ArrayIndexOutOfBoundsException 数组下标出界数组下标出界 NullPointerException 试图访问试图访问null对象引用对象引用 SecurityException 试图违反安全性试图违反安全性 ClassNotFoundException 不能加载请求的类不能加载请求的类 AWTException AWT 中的异常中的异常 IOException I/O异常的根类异常的根类 FileNotFoundException 不能找到文件不能找到文件 EOFException 文件结束文件结束 IllegalAccessException 对类的访问被拒绝对类的访问被拒绝 NoSuchMethodException 请求的方法不存在请求的方法不存在 Hands-On实训教程系列实训教程系列用户自定义异常用户自定义异常l内置异常不可能始终足以捕获所有错误,因此需要内置异常不可能始终足以捕获所有错误,因此需要用户自定义的异常类用户自定义的异常类l用户自定义异常主要用来处理用户程序中特定的逻用户自定义异常主要用来处理用户程序中特定的逻辑运行错误辑运行错误 l用户自定义的异常类应为用户自定义的异常类应为 Exception 类(或者类(或者Exception 类的子类)的子类类的子类)的子类l例如:例如:public class NumberException extends Exception public NumberException()super(输入的不是一个输入的不是一个100以内的正整数!以内的正整数!);Hands-On实训教程系列实训教程系列异常的抛出异常的抛出1l异常抛出异常抛出系统自动抛出(系统定义异常类的对象)系统自动抛出(系统定义异常类的对象)手工抛出(自定义异常对象或系统异常对象)手工抛出(自定义异常对象或系统异常对象)l手式抛出异常时用手式抛出异常时用throw语句语句 使用使用throw语句就可以明确地抛出一个异常语句就可以明确地抛出一个异常 throw语句格式为:语句格式为:Hands-On实训教程系列实训教程系列异常的抛出异常的抛出2lthrows语句语句如果一个方法可能导致一个异常但不处理它,此如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含时要求在方法声明中包含 throws 子句,通知潜子句,通知潜在调用者,如果发生了异常,由调用者处理。在调用者,如果发生了异常,由调用者处理。一个一个throws子句列举了一个方法可能引发的所有子句列举了一个方法可能引发的所有异常类型。异常类型。例如例如 public static boolean chick(String temp)throws NumberException Hands-On实训教程系列实训教程系列异常的抛出异常的抛出3lthrow与与throws的区别的区别throws出现在方法头,而出现在方法头,而throw出现在方法体中。出现在方法体中。throws表示出现异常的一种可能性,并不一定会表示出现异常的一种可能性,并不一定会发生这些异常,执行发生这些异常,执行throw则一定抛出了某种异常。则一定抛出了某种异常。两者都是消极处理异常的方式(这里的消极并不两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异是说这种方式不好),只是抛出或者可能抛出异常,但是不会由方法去处理异常,真正的处理异常,但是不会由方法去处理异常,真正的处理异常由方法的上层调用处理。常由方法的上层调用处理。Hands-On实训教程系列实训教程系列捕获异常捕获异常1lJava语言中异常的捕获是通过语言中异常的捕获是通过try-catch-finally语句来实现的。语句来实现的。try/有可能抛弃异常的代码catch(Exceptionname1 e)/异常处理代码catch(Exceptionname2 e)/异常处理代码finally/此部分代码总被执行 Hands-On实训教程系列实训教程系列Try-catch-finally执行流程执行流程无异常异常try、catch 和 finally 块的执行流程 Hands-On实训教程系列实训教程系列try块块ltrytry块中的语句体是程序中有可能产生一个或多个块中的语句体是程序中有可能产生一个或多个异常的语句,该段语句是程序正常情况下应该要异常的语句,该段语句是程序正常情况下应该要完成的功能完成的功能。Hands-On实训教程系列实训教程系列Catch块块1lCatch块块每个每个try代码块可以伴随一个或多个代码块可以伴随一个或多个catch块,用块,用于捕获并处理于捕获并处理try代码块中所生成的异常。代码块中所生成的异常。catch语句只需要一个形式参数指明它能捕获的异常类语句只需要一个形式参数指明它能捕获的异常类型,这个类型必须是型,这个类型必须是Throwable的子类,运行时的子类,运行时系统通过参数值把被抛出的异常对象传递给系统通过参数值把被抛出的异常对象传递给catch块。块。Hands-On实训教程系列实训教程系列Catch块块2l每个每个catch块都有一个异常类对象作为参数块都有一个异常类对象作为参数 l一个异常对象能否被一个一个异常对象能否被一个catch语句块所接收,语句块所接收,主要看该异常对象与主要看该异常对象与catch块的异常参数的匹块的异常参数的匹配情况:当它们满足下面三个条件的任何一个配情况:当它们满足下面三个条件的任何一个时,异常对象将被接收。时,异常对象将被接收。异常对象与参数属于相同的异常类异常对象与参数属于相同的异常类异常对象属于参数异常类的子类异常对象属于参数异常类的子类异常对象实现了参数所定义的接口异常对象实现了参数所定义的接口 Hands-On实训教程系列实训教程系列Catch块块3lcatch语句的顺序语句的顺序 先捕获子类异常,再捕获父类异常先捕获子类异常,再捕获父类异常 l例如:例如:int x=0;tryint y=10/x;catch(ArithmeticException e)System.out.println(devide by zero);catch(Exception e)System.out.println(There is an exception);Hands-On实训教程系列实训教程系列Catch块块4l异常只能被捕捉一次异常只能被捕捉一次l如果异常没有被捕捉,程序流程将返回到调用如果异常没有被捕捉,程序流程将返回到调用该方法的上层方法该方法的上层方法 Hands-On实训教程系列实训教程系列Finally块块lfinally确保了在出现异常时所有清除工作都将得到处理确保了在出现异常时所有清除工作都将得到处理与与 try 块一起使用块一起使用无论是否出现异常,无论是否出现异常,finally块都将运行块都将运行 Hands-On实训教程系列实训教程系列异常类常用方法异常类常用方法1lpublic String getMessage();getMessage()方法返回描述当前异常类的消息字方法返回描述当前异常类的消息字符串。符串。lpublic String toString();toString()方法返回描述当前异常类的消息的字符方法返回描述当前异常类的消息的字符串,一般由三部分组成:此对象实际类的名称、串,一般由三部分组成:此对象实际类的名称、冒号和空格、此对象冒号和空格、此对象getMessage()方法的结果。方法的结果。Hands-On实训教程系列实训教程系列异常类常用方法异常类常用方法2lpublic void printStackTrace();printStackTrace()方法没有返回值,它的功能是方法没有返回值,它的功能是完成一个打印操作,在当前的标准输出上打印输完成一个打印操作,在当前的标准输出上打印输出当前异常对象的堆栈使用轨迹,也即程序先后出当前异常对象的堆栈使用轨迹,也即程序先后调用执行了哪些对象或类的哪些方法,使得运行调用执行了哪些对象或类的哪些方法,使得运行过程中产生了这个异常对象。过程中产生了这个异常对象。
展开阅读全文