java课件第9章91异常处理.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 16 页
结束
当catch前面的try块中发生了一个异常,try-catch语句就会自动在try 块后面的各个catch块中,找出与该异常类相匹配的参数。当参数符合以 下三个条件之一时,就认为这个参数与产生的异常相匹配:
(1) 参数与产生的异常属于一个类; (2) 参数是产生的异常的父类; (3) 参数是一个接口时,产生的异常实现了这一接口。
带throws异常说明的方法说明形式如下: … 方法名(…) throws 异常类列表 { 方法体 }
第7页
结束
方法抛出的异常类是throws子句中指定的异常类或其子类。 比如在方法的说明中指明方法可能产生IOException, 但是实 际上可能抛出的异常或许是EOFException类的实例,这些异 常都是IOException的子类。
第6页
结束
9.1.2 抛出异常
Java提供了两种不同的异常抛出机制: throws抛出异常——间接抛出异常 throw 抛出异常——直接抛出异常
1. throws 抛出异常
throws异常说明总是和方法说明出现在一起。这样,方法说明 告诉编译器该方法可能会产生哪些异常,从而要求它的调用者必 须考虑处理这些异常。
static String getInput() throws IOException
// getInput()方法抛出异常,因为在它的方法体中调用的 //read方法抛出异常,并且该方法体本身使用throw抛出异常
{ char [] buffer = new char[20]; int counter = 0; boolean flag = true; while(flag) { buffer[counter] = (char)System.in.read();
第4页
结束
2. 异常类的层次
异常在Java中也是作为类的实例的形式出现的。Java中的所有的异常
类都是从ng.Throwable类派生出来的。 其层次结构如下图所示。
Object
Throwable
Exception
Error
IOException RuntimeException
第5页
try
//有多个语句抛出异常
{ fis=new FileInputStream(“c:/fileName.txt”);
//filename.txt指要读入的文件名
int c=fis.read (); //读字节整数
}
catch (FileNotFoundException e)
{
//捕获FileNotFoundException异常
异常可以在该程序中进行捕获、处理,也可以让调用该方法者捕获、处 理。
throw语句的形式: throw 异常类的实例;
例. throw抛出异常
import java.io.IOException;
public class ThrowException
{ public static void main(String args[]) {
当产生的异常找到了第一个与之相匹配的参数时,就执行包含这一参数 的catch语句中的Java代码,执行完catch语句后,程序恢复执行,但不 会回到异常发生处理继续执行,而是执行try-catch结构后面的代码。
ቤተ መጻሕፍቲ ባይዱ
第 17 页
结束
9.1.4 finally子句
finally语句可以说是为异常处理事件提供的一个清理机制,一般是用 来关闭文件或释放其他的系统资源,作为try-catch-finally结构的一部 分,可以没有finally语句,如果存在finally语句,不论try块中是否发生 了异常,是否执行过catch语句,都要执行finally语句。
第8页
结束
在下列情况下Java方法抛出异常: (1)调用的方法抛出了异常; (2)检测到了错误并使用throw语句抛出异常; (3)程序代码有错误,从而异常,比如数组越界错误。
例. throws抛出一个异常
class Test {…… public String getInput() throws IOException //抛出异常 { …… }
System.out.println(c.toString());
封面
第1页
结束
第9章 Java高级编程
9.1 异常处理 9.2 Java多线程机制 9.3 I/O数据流与文件处理 9.4 网络编程 9.5 数据库操作
第2页
结束
9.1 异常处理
9.1.1 异常类的层次 9.1.2 抛出异常 9.1.3 捕获异常 9.1.4 finally子句
(2) try块中的语句产生了异常,而且此异常在方法内被捕获。在这种情况下, Java首先执行try块中的语句,直到产生异常处,然后跳过此try块中剩下的语句, 执行捕获此异常的catch子句的处理代码;然后执行finally子句中的代码;
(3) 如果catch子句中没有重新抛出异常,那么Java将执行try…catch…finally 块后面的语句。如果在catch子句又重新
{ int c=fis.read();
//调用的read()方法抛出异常
}
catch (IOException e) //捕获IOException异常
{ System.out.println("catchexception:"+e.getMessage()); }
}}
第 15 页
结束
上述try-catch语也可改写成:
带有finally子句的try-catch-finally语句的形式如下:
try { … }
//正常执行的代码, 可能产生异常
catch(异常类1 e1){ … } //异常类1的处理代码
catch(异常类2 e2){ … }
//异常类2的处理代码
……
catch (异常类n en) { … } //异常类n的处理代码
第 19 页
结束
抛出了异常,那么Java将这个异常抛出给方法的调用者; (4) try块中产生了异常,而此异常在方法内没有被捕获。在这种情况
下,Java将执行try块中的代码直到产生异常,然后跳过try块中的代码 而转去执行finally子句中的代码,最后将异常抛出给方法的调用者。
例. 打开一个文件流,读入两个字符串,转化为整数,并求其和。
结束
RuntimeException类处理的错误包括:错误的强制类型转换、 数组越界访问、空引用。
RuntimeException是程序员编写程序不正确所导致的异常, 是在Java系统运行过程中出现的异常,如除数为零等。由于运行 时异常可能会出现在程序的任何地方,而且出现的可能性非常大, 因而由程序本身去检测运行异常出现与否,将会使程序的开销过 大,所以编译器并不要求程序去说明或捕获运行时异常。理论上, 程序员经过检查和测试可以查出这类错误。
import java.io.*; public class Try_catch {public static void main (String args[]) {FileInputStream fis=null; try { fis=new FileInputStream("c:/filename.txt"); }
finally { … } //必须执行的语句
第 18 页
结束
带有finally子句的try-catch-finally语句无论在try块中是否产生异常,也不管 产生的异常是否会被捕获,finally中的语句最终都会被执行。具体的执行过程如下:
(1) try块中的语句没有产生异常。在这种情况下,Java首先执行try块中的所有 的语句,然后执行finally子句中的代码,最后执行try…catch..finally块后面的语 句;
第3页
结束
9.1.1 异常类的层次结构
1. 异常处理的概念
当程序运行的时候,经常会由于各种不可避免的原因而 产生错误。例如除数为零、文件找不到而无法读写等等。 Java提供的丰富的异常情况处理机制通常叫异常处理。异 常处理把Java程序各种可能出现的错误都看作异常,集中 起来统一处理。
程序员可以在程序中定义异常处理段来捕获和处理异常, 说明何处可能出现异常,如何处理。这样,当异常发生时 将被捕获和处理,使程序在出现异常的情况下能够继续执 行,提高程序的健壮性。
封面结束第第99章章javajava高级编程高级编程9191异常处理异常处理92java92java多线程机制多线程机制93io数据流与文件处理数据流与文件处理9494网络编程网络编程9595数据库操作数据库操作结束911911异常类的层次异常类的层次912912抛出异常抛出异常913913捕获异常捕获异常914finally914finally子句子句结束当程序运行的时候经常会由于各种不可避免的原因而产生错误
try {
String s=getInput(); //getInput()中throw抛出异常 System.out.println(s);
}
第 11 页
结束
catch(IOException e) // 捕获异常 {System.out.println(e.getMessage()); } }
//建立读入“myfile.txt”文件的输入流
String stra=fis.readln(); //读入一个字符串
int a=Integer.parseInt(stra); //把该字符串转化为整数
String strb=fis.readln();
int b=Integer.parseInt(strb); int c=a+b;
}
第9页
结束
例. throws抛出多个异常
class Animation
{
// throws多个异常
public Image loadImage(String s) throws
EOFException, MalformURLException
{
……
}
}
第 10 页
结束
2. throw抛出异常
在程序中使用throw语句(注意,不是throws)来抛出异常,该
System.out.println("catchexception:"+e.getMessage());
}
catch(IOException e)
//捕获IOException异常
{System.out.println("catchexception:"+e.getMessage()); }
//在这里用e.getMessage()得到有关异常的信息
并非所有可能发生的异常都要在方法中指定,从Error类中 派生出的异常和从RuntimeException类中派生的异常就不用 在方法声明中指定。这两类异常属于不检查异常。不检查异常 则是那些无法干预的异常。 Java中的另一类异常是检查异常, 检查异常是那些在程序中应该处理的异常,程序完全可以避免 的异常(比如数组越界错误)。而throws异常说明必须指定有 可能发生的检查异常。
import java.io.*;
class sum
{public static void main(String args[]) { DataInputStream fis=null;
第 20 页
结束
try {
fis=new DataInputStream(new InputStream("myfile.txt"));
}
}
return new String(buffer);
}
}
第 13 页
结束
9.1.3 捕获异常
使用try-catch语句可以捕获和处理异常。语句形式如下: try
{ 语句系列 } catch(异常类1 变量名1){ 异常处理 }
…… catch(异常类n 变量名n){ 异常处理 } [finally 语句]
// FileInputStream 方法抛出异常,所以位于try体内
catch (FileNotFoundException e)
//捕获 FileNotFoundException异常
{System.out.println("catchexception"+e.getMessage());}
try
其中: try之后的复合语句说明抛出异常的部位,该部位含有抛出异常的语句,
如调用抛出异常的方法等; catch(异常类 变量名) 是按抛出的异常类进行捕获; 异常处理是对捕获的异常作相应的处理; 如果有finally部分,其后的语句是最后必然要执行的语句。
第 14 页
结束
例. try-catch异常处理
第 12 页
结束
if (buffer[counter]=='\n') flag = false;
counter++;
if (counter>=20){
IOException ae=new IOException("buffer is full");
//构造异常类实例
throw ae;
//抛出异常类的实例