java基础教程61异常

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
生成的异常对象将传递给Java运行时系统, 这一异常的产生和提交过程称为抛出(throw)异 常。
两种处理异常的机制:
◇ 捕获异常:
当Java运行时系统得到一个异常对象时,它将会寻 找处理这一异常的代码。找到能够处理这种类型的异常 的方法后,运行时系统把当前异常对象交给这个方法进 行处理,这一过程称为捕获(catch)异常。
Exception(程序中的问题,可预知的): Java编 译器要求Java程序必须捕获或声明所有的 非运行时异常
throw:用户自己产生异常
常见的异常
• ArithmeticException
• ArrayIndexOutOfBandsException
• ArrayStoreException
{ String output=" "; int i; for(i=1;i<=10;i++){ if (i==5) break; output+=i+" "; } output+="\nBroke out of loop at i ="+1; System.out.println(output); }
public static void main( String args[ ] ) {
int a = 0; System.out.println( 5/a ); } }//运行时异常
4.1.2 异常处理机制
抛出(throw)异常:
在Java程序的执行过程中,如果出现了异 常事件,就会生成一个异常对象。
^
G:\java\ExceptionDemo1.java:11: unreported exception java.io.IOException; must be caught or declared to be thrown
fis.close( );
^
3 errors
ห้องสมุดไป่ตู้
class ExceptionDemo2 {
public static void main( String args[ ] ) { FileInputStream fis = new FileInputStream( "text" ); int b; while( (b=fis.read())!=-1 ) { System.out.print( b ); } fis.close( ); }
}//编译时异常
G:\java\ExceptionDemo1.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
{
FileInputStream fis = new
以常规方法处理错误 openFiles; if (theFilesOpen) { determine the lenth of the file; if (gotTheFileLength){ allocate that much memory; if (gotEnoughMemory) { read the file into memory; if (readFailed) errorCode=-1; else errorCode=-2; }else errorCode=-3; }else errorCode=-4 ; }else errorCode=-5;
4.2.2 声明抛弃异常 1. 声明抛弃异常
如果在一个方法中生成了一个异常,但是这一方法 并不确切地知道该如何对这一异常事件进行处理,这时, 一个方法就应该声明抛弃异常,使得异常对象可以从调 用栈向后传播,直到有合适的方法捕获它为止。
声明抛弃异常是在一个方法声明中的throws子句 中指明的。例如:
java中的异常类( Throwable )可分为两大类: ◇ Error ◇ Exception
Error:由Java虚拟机生成并抛出,Java程序不 做处理.
Runtime Exception(被0除等系统错误,数组 下标超范围):由系统检测, 用户的Java 程序 可不做处理,系统将它们交给缺省的异常处 理程序.
如果Java运行时系统找不到可以捕获异常的方法, 则运行时系统将终止,相应的Java程序也将退出。
◇ 声明抛弃异常:
如果一个方法并不知道如何处理所出现的异常,则 可在方法声明时,声明抛弃(throws)异常。这是一 种消极的异常处理机制。
4.1.3 异常类的层次
在jdk中,每个包中都定义了异常类,而所有的异 常类都直接或间接地继承于Throwable类。
try{ ......
}catch( FileNotFoundException e ){ System.out.println( e ); System.out.println( "message:
"+e.getMessage() ); e.printStackTrace( System.out );
• 观察前面的程序你会发现大部分精力 花在出错处理上了.
• 只把能够想到的错误考虑到,对以外 的情况无法处理
• 程序可读性差
• 出错返回信息量太少
用异常的形式处理错误 read-File; { try { openTheFile; determine its size; allocate that much memory; closeTheFile; }catch(fileopenFailed) { dosomething; } catch(sizeDetermineFailed) {dosomething;} catch(memoryAllocateFailed){ dosomething;} catch(readFailed){ dosomething;} catch(fileCloseFailed) { dosomething; } }
}
第四章 Java 的异常处理
4.1 什么是异常
异常就是在程序的运行过程中所发生的异常 事件,它中断指令的正常执行。
没有处理错误的程序: read-file {
openTheFile; determine its size; allocate that much memory; closeTheFile; }
}finally { ...... }
◇ try
捕获异常的第一步是 用try{…}选定捕获异常的 范围,由try所限定的代码 块中的语句在执行过程中 可能会生成异常对象并抛 弃。
◇ catch
每个try代码块可以伴随一个或多个catch语句,用 于处理try代码块中所生成的异常事件。catch语句只需 要一个形式参数指明它所能够捕获的异常类型,这个类 必须是Throwable的子类,运行时系统通过参数值把被 抛弃的异常对象传递给catch块。
在catch块中是对异常对象进行处理的代码,与访 问其它对象一样,可以访问一个异常对象的变量或调用 它的方法。getMessage( )是类Throwable所提供的方 法,用来得到有关异常事件的信息,类Throwable还提 供了方法printStackTrace( )用来跟踪异常事件发生时 执行堆栈的内容。
… }
注意:
一个方法所声明抛弃的异常是作为这个方 法与外界交互的一部分而存在的。所以,方法的 调用者必须了解这些异常,并确定如何正确的处 理他们。
2.抛出异常
抛出异常就是产生异常对象的过程,首先要 生成异常对象,异常或者由虚拟机生成,或者由
某些类的实例生成,也可以在程序中生成。在方 法中,抛出异常对象是通过throw语句实现的。
}catch( IOException e ){ System.out.println( e );
}
catch 语句的顺序:
捕获异常的顺序和catch语句的顺序有关, 当捕获到一个异常时,剩下的catch语句就不再 进行匹配。
因此,在安排catch语句的顺序时,首先应 该捕获最特殊的异常,然后再逐渐一般化。也就 是一般先安排子类,再安排父类。
例如: IOException e=new IOException(); throw e ;
可以抛出的异常必须是Throwable或其子类 的实例。
public int read () throws IOException{ ......
}
throws子句中同时可以指明多个异常,之 间由逗号隔开。例如:
public static void main(String args[]) throws IOException, IndexOutOfBoundsException {
和传统的方法比较异常的优点:
1. 把错误代码从常规代码中分离出来 2. 把错误传播给调用堆栈 3. 按错误类型和错误差别分组 4. 系统提供了对于一些无法预测的错误的捕获
和处理 5. 克服了传统方法的错误信息有限的问题
4.1.1 异常示例 import java.io.*; class ExceptionDemo1 {
}
例四: public class TestContinue { public static void main(String[] arg)
{ String output=" "; int i; for(i=1;i<=10;i++){ if (i==5) continue; output+=i+" "; } output+="\nBroke out of loop at i ="+1; System.out.println(output); }
public static void main(String[] arg) {
for(int i=1, j=i+10 ; i<5; i++ , j=i*2) System.out.println("i="+i+" j="+j); } }
例三: public class TestBreak { public static void main(String[] arg)
4.2 异常的处理
java语言中有两种异常处理机制:捕获异常 和声明抛弃异常。下面我们做详细介绍。
4.2.1 捕获异常
捕获异常是通过try-catch-finally语句实现 的。
try{ ......
} catch( ExceptionName1 e ) { ...... }
catch( ExceptionName2 e ) { ...... } ......
例一: public class TestFor {
public static void main(String[] arg) {
for(int i=1, j=i+10; i<5; i++){ j=i*2; System.out.println("i="+i+" j="+j); } } }
例二、 public class TestFor {
◇ finally
捕获异常的最后一步是通过finally语句为异 常处理提供一个统一的出口,使得在控制流转到 程序的其它部分以前,能够对程序的状态作统一 的管理。
不论在try代码块中是否发生了异常事件, finally块中的语句都会被执行。
finally在文件处理时非常有用 try { 对文件进行处理的程序; }catch(IOException e) { //对文件异常进行处理; }finally { 不论是否发生异常,都关闭文件; }
• IOException
如果在使用能够
• FileNotFoundException • NullPointerException • MalformedURLException
产生异常的方法 而没有捕获和处 理,将不能通过 编译
• NumberFormatException
• OutOfMemoryException
FileInputStream( "text" );
^
G:\java\ExceptionDemo1.java:7: unreported exception java.io.IOException; must be caught or declared to be thrown
while( (b=fis.read())!=-1 )
相关文档
最新文档