版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章 异常处理,通过本章的学习,主要掌握以下知识点: 异常处理的机制 捕获与处理异常 多异常处理 抛出异常 自定义异常类 本章的重点: 异常处理的机制 捕获与处理异常 本章的难点: 自定义异常类,1、java异常的概念:,异常exception:程序中出现的问题或不常见的情形。 异常由程序或者运行时环境抛出,并能被捕获,需要的话可以进行适当的处理。,可能导致异常的原因,试图被0除;,数组下标越界;,没有找到指定的文件;,请求的I/O操作没有正常的执行;,试图访问空引用所指的对象;,试图执行一个违反某类安全措施的操作; ,9.1 异常处理的基本概念,9.1.1 错误和异常 按照错误的性质可将程
2、序错误分为语法错、语义错、逻辑错。,在Java中的编译错误是由于编写的程序代码中存在着语法错误,而未能通过由源代码到字节码的编译过程而产生的错误。语法错误是由语言的编译系统负责检测和报告。没有编译错误是一个程序能正常运行的基本条件,只要没有编译错误,Java的源代码才能被编译成字节码。,运行错误是程序运行过程中产生的错误,根据性质的不同,运行错误又分为系统运行错误和逻辑运行错误。 系统运行错误简称为错误,是指程序在执行过程中所产生对操作系统的损害。 逻辑运行错误是指程序不能实现程序员的设计意图和设计功能而产生的错误,这种错误也被称为异常。,异 常,异常:指程序在运行过程中发生了由于算法考虑不周
3、或软件设计错误等导致的程序异常事件。 错误:指程序在执行过程中所遇到的硬件或操作系统的错误。,异常例子,public class HelloWorld public static void main (String args) int i = 0; String greetings = Hello world!, No, I mean it!, HELLO WORLD! ; while (i 4) System. out. println (greetings i); i+; ,public class ExceptionDemo public static void main(String
4、args) int i = 0; System.out.println(5/i); ,Java语言的异常处理机制,1)抛出异常:在堆栈中创建一个异常对象。 当方法中有一个错误发生后,该方法创建一个异常对象并把它交给运行系统。异常对象中包含了有关异常的信息,如异常类型、发生错误时的程序状态等。 2)捕获异常:找到异常处理程序。 运行时系统在方法调用堆栈里为被抛出的异常查找处理代码。运行系统从发生错误的方法开始进行回朔,在方法调用堆栈里向后搜索,直到找到能处理当前发生的异常的处理程序的方法。 3)处理异常。 通过方法调用来处理异常。 4)终止或恢复运行。 如果运行时系统在方法调用栈查遍了所有的方法
5、(主方法中)而未找到合适的异常处理程序,则运行时系统终止执行。,9.2异常处理类,所有异常类型都是 Throwable的子类,用户程序可能 捕获的异常,也是用来创建用户异常类型子类的基类。,用于显示与Java运行时系统本身有关的错误,Error类对象由Java虚拟机生成并抛出; Exception类对象由应用程序处理或抛出。,运行时异常,是程序运行时自动对某些错误做出反应而产生的,1、Throwable类是所有异常类型的父类,不能被直接使用,表示任何可以作为异常被抛出的类。 2、Error用来表示编译时和系统错误,表示恢复不是不可能但很困难情况下的一种严重问题。比如说内存溢出,它不可能执行程序
6、处理这样的问题,一般是和VM有关的问题。,异常类及其子类-2,3、Exception是可以被抛出的基本异常类型,在JAVA类库、用户方法以及运行时故障中都可能抛出Exception型异常。 RuntimeException 运行时异常。它表示程序运行正常的话就不会发生这种问题,这种异常不用在程序中把他们列出来,运行时有问题,会自动被JVM抛出。比如空指针异常,数组超出异常。 除了运行时例外之外的其他由Exception 继承来的例外类都是非运行时的例外,例如FileNotFoundException(文件未找到例外)。Java编译器要求在程序中必须处理这种例外,捕获例外或者声明抛弃例外。,Th
7、rowable类的常用方法 public String getMessage() 返回异常的原因 getStackTrace() 返回堆栈跟踪情况 public void printStackTrace() 打印堆栈的标准错误流 printStackTrace(PrintStreams) 打印堆栈的标准打印流 public String toString() 返回简单描述 .,9.3 捕获与处理异常,在Java语言中,异常处理是通过try、catch、finally、throw、throws五个关键字来实现的。,当一个异常类的对象被捕获或接收后,用户程序就会发生流程跳转,系统终止当前的流程而跳
8、转到专门的异常处理语句块,或直接跳出当前程序和java虚拟机回到操作系统。,2020/8/2,16,在Java的异常处理机制中,提供了try-catch-finally语句来捕获和处理一个或多个异常,其语法格式如下:,try catch (异常类名 形参对象名) finally ,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。,1、catch必须紧跟在try之后 2、可有多个catch块,但异常类型必须是层层嵌套的,即先从子类异常,最后才到父类异常。 3、当抛出异常时,异常处理机制将负责搜索参数与异常类型相匹配的第一个处理程序。 4、只有匹配的catch子句能执行,和sw
9、itch不同,不需要break. 5、可通过throwable类提供的方法getMessage(),printStackTrace( ) 来跟踪异常事件发生时执行堆栈的内容。,为异常处理提供一个统一的出口或定义跳转流程,多异常处理 try . catch(ExceptionName1 e1 ) . catch(ExceptionName2 e2 ) . catch(ExceptionNameN eN ) . finally . ,import java.io.*; public class test92 public static void main(String args) FileRead
10、er fr; try fr=new FileReader(d:a.txt); catch(Exception e) e.printStackTrace(); finally if(fr!=null) try fr.close(); catch(Exception e) e.printStackTrace(); ,public class app9_2 public static void main(String args) int i; int a=1,2,3,4; for(i=0;i5;i+) try System.out.print(a+i+/+i+=+(ai/i); catch(Arra
11、yIndexOutOfBoundsException e) System.out.print(捕获了数组下标越界异常); catch(ArithmeticException e) System.out.print(异常类名称是:+e); catch(Exception e) System.out.print(捕获+e.getMessage()+异常!); finally System.out.println( finally i=+i); System.out.println(继续!); ,public class test91 public static void main(String a
12、rgs) int a=1,2,3,4; int x=0; try x=10/x;/public class test91 public static void main(String args) int a=1,2,3,4; int x=0; try x=10/x; System.out.println(a4); catch(Exception e) System.out.println(e.getMessage(); e.printStackTrace(); finally System.out.println(finally i=+x); 遇到异常,停止执行try后面的语句 System.
13、out.println(a4); catch(Exception e) System.out.println(e.getMessage(); e.printStackTrace(); finally System.out.println(finally i=+x); ,注意:,异常捕获的过程中做了两个判断,一是try程序块中是否有异常产生,第二个是产生的异常是否和catch后面括号内捕获的异常匹配。 catch块中的语句应根据异常的不同而执行不同的操作,比较通用的做法是输出异常和错误的相关信息,包括异常名称、产生异常的方法名等。 处理多异常是应注意catch块的排列顺序,将处理较具体、较常见的
14、异常catch块应放在前面,而可以与多种异常相比配的catch块应放在较后的位置。,4、finally语句块用来为异常处理提供一个统一的出口,finally通常用于对一些资源做清理工作,如关闭打开的文件。 5、finally块可以省略。 6、当catch块中包含System.exit(0)时,不执行finally语句块。,9.4 抛出异常,抛出异常的方法: (1)系统自动抛出异常。 (2)使用throw语句抛出异常,用户程序自定义的异常,必须借助于throw语句来定义何种情况下产生了此种异常对应的错误。(手动抛出异常) 格式:throw 由异常类所产生的对象 throw new ArriayI
15、ndexOutOfBoundException();,但是有时候有些错误在jvm看来不是错误,比如说 int age = 0; age = -100; System.out.println(age); 需要自己手动引发异常,这就是throw的作用。 int age = 0; age = -100; if(age0) Exception e = new Exception(“throw exception”);/创建异常对象 throw e;/抛出异常 /throw new Exception(“throw exception”); System.out.println(age);,public
16、 class app9_4 public void run(byte k) byte y=1,i; System.out.print(k+!=); for(i=1;iByte.MAX_VALUE/i) throw new Exception(溢出!); else y=(byte)(y*i); catch(Exception e) System.out.println(异常:+e.getMessage(); e.printStackTrace(); System.exit(0); System.out.println(y); public static void main(String args
17、) app9_4 a=new app9_4(); for(byte i=1;i10;i+) a.run(i); ,例题:,从键盘输入一字符串,当字符串中包含”T”或”t”时,抛出一个算术异常,处理方式为打印出错信息.,import java.util.*; public class testexception public static void main(String args) Scanner reader=new Scanner(System.in); String input; char c; System.out.println(请输入字符串); try input=reader.n
18、ext(); for(int i=0;iinput.length();i+) c=input.charAt(i); if(c=T|c=t) throw new ArithmeticException(); else System.out.print(c); catch(ArithmeticException e) e.printStackTrace(); ,抛出异常的方法,如果在一个方法内部的语句执行时可能引发某种异常,但是并不确定如何处理,则此方法应抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。 在程序中的异常没有用trycatch语句捕获异常和处理异常的代码,则可
19、以在程序代码所在的方法声明的后面用throws关键字声明该方法要抛出异常。,抛出异常的方法,格式: 修饰符 返回值类型 方法名(参数列表) throws 异常类列表 “异常类列表”是方法中要抛出的异常类,当异常类多于一个时用“,”隔开。 当一个方法抛出异常后,系统将异常向上传递,由调用它的方法来处理这些异常。,public class app9_6 public static void check(String str1) char ch; for(int i=0;istr1.length();i+) ch=str1.charAt(i); if(!Character.isDigit(ch) t
20、hrow new NumberFormatException(); ,public static void main(String args) int num; try check(args0); num=Integer.parseInt(args0); if(num60) System.out.println(成绩为:+num+ 及格); else System.out.println(成绩为:+num+ 不及格); catch(NumberFormatException e) System.out.println(输入的参数不是数值类型); catch(Exception e) Syste
21、m.out.println(命令行中没有提供参数); ,若方法内有使用throw抛出异常的语句或有用trycatch处理异常的语句,则在定义方法的头部可不用throws子句抛出与其相对应的异常。,IOException类的异常处理 直接由主方法main( )抛出异常,在main( )后加throws IOException子句。 在程序代码内编写try-catch块来捕获由系统抛出的异常。 在main( )后加throws IOException子句抛出异常,也可以在程序中try-catch块来捕获由系统抛出的异常。,import java.io.*; public class app9_7
22、public static void main(String args) String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); while(true) try System.out.print(请输入字符串:); str=buf.readLine(); if(str.length()0) break; else throw new IOException(); catch(IOException e) System.out.println(必须输入字符串!); conti
23、nue; String s=str.toUpperCase(); System.out.println(转换后的字符串为:+s); ,自定义异常类,声明一个新的异常类,该异常类必须从Java已有定义的异常类继承,如Exception、IOException等。 为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。,例子:DefineExceptionDemo.java,自定义异常类例子,public class MyException extends Exception private int x; public MyException( ) p
24、ublic MyException( String msg) super(msg); public MyException( String msg , int x ) super(msg); this.x = x; public int val() return x ; public String getMessage() return Detail Message : +x+ +super.getMessage(); ,例子:ExtraFeatures.java,习题,关于垃圾收集机制的叙述正确的是( )。 A垃圾收集将检查并释放不再使用的内存 B程序开发者必须自己创建一个线程进行内存释放的工作 C垃圾收集允许程序开发者明确指定并立即释放该内存 D垃圾收集能够在期望的时间释放被java对象使用的内存,下列哪些语句关于Java内存回收的说明是正确的? ( ) A、程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年六维力 力矩传感器与柔性力控技术实现主动柔顺控制
- 2026年浙江省丽水市莲都区普通高中初三质量监测(四)化学试题试卷含解析
- 江苏省淮安市经济开发区2025-2026学年中考模拟(三)生物试题含解析
- 广西防城港市防城区港市2026年高补班下学期开学考试化学试题含解析
- 2026年山西省运城市新绛县万安中学初三下学期生物试题大练习四含解析
- 2026届期河南省南阳市南召县初三下学期一轮复习效果检测试题化学试题含解析
- 2025-2026学年浙江省湖州市南浔区重点名校初三第一次模拟考试适应性测试化学试题含解析
- 湖北省荆门市重点达标名校2025-2026学年初三“四校联考”第二次考试化学试题含解析
- 2026年山西省忻州市下学期初三模拟生物试题含解析
- 山东省聊城市临清市2025-2026学年初三练习题一(山东卷)生物试题含解析
- 2025-2030特膳食品在医院渠道的准入机制与销售策略报告
- 2025年消防党组织谈心谈话记录范文
- 基于PLC的立体仓库堆垛机智能控制系统设计
- 暗访人员管理办法
- 模具维护保养管理办法
- 水利项目审批管理办法
- 超声刀的使用与维护指南
- 三基培训 课件
- 三种方法评标计算(自带公式)
- 电气控制与PLC应用技术-西门子S7-200 SMART PLC第三版黄永红习题答案
- 第四章 物质的特性 单元测试-七年级科学上册同步备课系列(浙教版)
评论
0/150
提交评论