haihongyuan.com
海量文库 文档专家
全站搜索:
您现在的位置:首页 > 小学教育 > 小学数学小学数学

第6章除法运算——异常处理

发布时间:2013-12-14 11:42:06  

能力目标: ? 学会使用try-catch-finally代码块处理异常。 ? 学会使用throw语句主动抛出异常,使用throws子句从方法声明中抛出异常。 ? 理解自定义异常类,了解断言语句。 ? 能运用异常处理机制编写整数、实数除法运算程序。

? ? ? ? ? ? ? ? ? ?

6.1 任务预览 6.2 异常 6.3 异常种类与层次结构 6.4 异常处理代码块try-catch-finally 6.5 throw语句与throws子句 6.6 自定义异常类 6.7 异常处理代码块嵌套 6.8 错误与断言 6.9 本章小结 6.10 实训6:除法运算程序

?

本章实训程序运行结果:

?

?
?

异常,即意外,英文是Exception。 异常通常是程序运行时出现的问题或错误。 【例6-1】编写没有异常处理的除数为0程序。

public class Example1 { public static void main(String[] args) { int x, y, z; x = 2; y = 0; z = x / y; System.out.println("整数除以0,得:" + z); } }

public class Example2 { public static void main(String[] args) { try{ int x, y, z; x = 2; y = 0; z = x / y; System.out.println("整数除以0,得:" + z); } catch (Exception e){ System.out.println("发生了异常:" + e.getMessage()); } } }

? ? ? ?

?

异常的种类很多,最顶层的异常类是Exception。 ArithmeticException →RuntimeException →Exception FileNotFoundException →IOException →Exception NumberFormatException →IllegalArgumentException →RuntimeException →Exception InputMismatchException →NoSuchElementException →RuntimeException →Exception

?

注意:系统预定义的异常类都以Exception结尾,要求自定 义异常类也以该单词结尾,例如MyException。

? ?

(1)带参数的try-catch 格式:

try { 可能发生异常代码 } catch (异常类 参数) { 异常处理代码 }

? ?

(2)不同异常作不同处理的try-catch…catch. 格式:
try { 可能发生异常代码 } catch (异常类1 参数1) { 异常处理代码1 } catch (异常类2 参数2) { 异常处理代码2 } ... catch (异常类n 参数n) { 异常处理代码n }

import java.util.*; … try{ Scanner scan = new Scanner(System.in); int x, y, z; System.out.println("请输入被除数:"); x = scan.nextInt(); System.out.println("请输入除数:"); y = scan.nextInt(); z = x/y; System.out.println("整除结果:" + z); } catch(InputMismatchException e){ System.out.println("输入不匹配异常:" + e.getMessage()); } catch(ArithmeticException e){ System.out.println("算术异常:" + e.getMessage()); } catch(Exception e){ System.out.println("异常:" + e.getMessage()); } …

?

?

(3)不处理异常的try-finally 格式:
try { 可能发生异常代码 } finally { 最终代码 }

? ?

(4)完整的异常处理块try-catch…catch-finally 格式:
try { 可能发生异常代码 } catch (异常类1 参数1) { 异常处理代码1 } catch (异常类2 参数2) { 异常处理代码2 } ... catch (异常类n 参数n

) { 异常处理代码n } finally { 最终代码 }

finally{ System.out.println("——程序结束。"); }

? throw语句语法:

throw new 异常类构造方法名(参数列表);
?

如:
throw new Exception("除数为零无意义");

? 使用throws子句在方法中抛出异常的格式如下:

… 返回类型 方法名(可选参数表) throws 异常类名{ 自动或主动引发异常的方法体代码 }

…double x, y, z; x = 23.5; y = 0; z = x/y; System.out.println("正实数除以零结果:" + z); x = -52.6; z = x/y; System.out.println("负实数除以零结果:" + z); x = 0; y = 0; z = x/y; System.out.println("零除以零结果:" + z); …

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

…static double divide(double x, double y) throws Exception{ if (y!=0){ return x/y; } //除法方法 else { throw new Exception("除数为零无意义"); //抛出异常语句 }} public static void main(String[] args) { try{ double x, y, z; String str; BufferedReader read = … while(true){ System.out.println("请输入被除数(直接按回车结束程序):"); str = read.readLine(); if (str.equals("")) { break; } x = Double.parseDouble(str); System.out.println("请输入除数:"); str = read.readLine(); y = Double.parseDouble(str); z = divide(x, y); //调用除法方法 System.out.printf("相除结果(保留两位小数):%.2f\n", z); } } catch(Exception e){ System.out.println("异常:" + e); } finally{ System.out.println("——程序结束。"); } …

要继承预定义异常类,如ArithmeticException、Exception等。 ? 【例6-7】自定义一个异常类,在double型除法运算方法中,遇到除数 为零,便抛出自定义异常对象。 class MyByZeroException extends ArithmeticException{ public MyByZeroException(String message){ super(message); } }
?

public class Example7 { //主类 static double divide(double x, double y) throws Exception{ if (y!=0){ return x/y; } else { throw new MyByZeroException("除数为零无意义"); } //抛出自定义异常 } …

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?
?

【例6-8】改进例6-7,编写嵌套的异常处理代码 块,使之发生除数异常时不终止程序运行。 … try{ //外层异常处理代码块 double x, y, z; String str; BufferedReader read = … while(true){ System.out.println("请输入被除数(直接按回车结束程序):"); str = read.readLine(); if (str.equals("")) { break; } x = Double.parseDouble(str); System.out.println("请输入除数:"); str =read.readLine(); y = Double.parseDouble(str); try{ //内层异常处理代码块 z = divide(x, y); System.out.printf("相除结果(保留两位小数):%.2f\n", z); } catch(MyByZeroException e){ … } } } catch(Exception e){ System.out.println("异常:" + e); } finally { System.out.println("——程序结束。"); } …

? Exception和Error都是Throwable类的子类, ? 但错误往往比异常严

重,如:断言错误AssertionError。 ? assert(断言)语句:武断地宣称的语句,如宣称某条

件必须成立。 语法有二:
?assert 条件表达式 ?assert 条件表达式 : 字符串型断言消息
? 遇到断言错误,如果虚拟机处于启用断言状态,则程序

非正常终止。 ? 默认虚拟机总是关闭断言。 断言语句适用程序调试排 错。 ? 允许执行断言命令格式:
?java -ea 主类名

…Scanner scan = new Scanner(System.in); System.out.println("请输入要计算平方根的数:"); double x = scan.nextDouble(); assert x>0 : "负数不能计算平方根"; //断言语句 double sqroot = Math.sqrt(x); System.out.printf("%.2f的平方根是%.4f\n", x, sqroot); …

?

异常是运行过程中出现了意外,无法按常规运行下去。使用try-catch-finally代 码块捕获并处理异常。

?

捕获、处理异常的代码块也可嵌套,以满足复杂的需求。

?
?

所有异常类构成树状的层次结构,最顶层的异常类是Exception。
异常可使用throw语句主动精确地抛出。还可把在方法中出现的异常踢给调用它 的方法来处理,这时要在方法头部使用throws子句。

?

除了异常外,还有Error(错误)。错误比异常严重,无法在程序中捕获和处理。
例如断言错误、虚拟机本身的错误等。

?

在断言语句中,如果断言条件不成立,就发生了断言错误,这时只好任由程序自 行中断运行。断言语句默认是不执行的,一般只在程序调试阶段启用断言。

?

(1)编写整数除法程序,运行时输入两个整数, 计算整除结果,要求捕获除数为零等异常。

?

(2)编写double型的实数除法程序,运行时输入
两个实数,计算相除结果,要求捕获并处理异常。

?

(3)编程,自定义一个异常类,在double型除法
运算方法中,遇到除数为零,就抛出自定义的异常

对象。


网站首页网站地图 站长统计
All rights reserved Powered by 海文库
copyright ©right 2010-2011。
文档资料库内容来自网络,如有侵犯请联系客服。zhit326@126.com