IO学习2nd——异常相关
????? Exception:异常,通常指的是程序运行期出现的错误。也就是说,java编程时出现的语法错误不在我们的考虑之列(实际上语法错误这种学期初期出现的问题在某些编程环境中是比较容易解决的,他总会给你提醒的,如eclipse)
?
?
???????异常的分类:
??????????????? 所有的Exception类都继承自java.lang.throwable类。实际上绝大多数Exception类都位于java.lang这个包,但也有一部分异常位于其他的包,如java.io.IOException等等。
????????????????????? Throwable类是所有Java 语言中所有错误或异常的超类(super)。它有2个很重要的子类:Error和 Exception。Exception下面又分2类,一种是特殊的RuntimeException,一种是其他的Exception。
????????????????????? Error类是系统错误类,可以简单的理解成JVM出错了,它定义了那些通常无法捕捉到的异常,通常我们程序员处理不了的,也不用处理。我们要谨慎使用和处理Error子类,因为它们通常会导致灾难性的失败。
????????????????????? Exception类是我们能处理的异常。我们可以catch它,可以处理它,也最好处理它。
????????????????????? RuntimeException类是我们写程序时经常出的错误。如什么IndexOutOfBoundsException?,NullPointerException等等?。这种异常我们可以catch它。
??????????????????????Exception类中的其他类,这类异常有一个特点,就是我们在写程序时必须catch它,否则系统不能完成编译。在API文档中,那些在方法中写了throws xxException的方法都是会抛出这种Exception对象的,都是必须catch的。这类异常包括IOException等等。
?
????????????????????? 实际上我们不必拘泥于Java中已有的异常类型,因为Java提供的异常类库不可能包括实际应用中出现的所有问题,所以自己定义出现的异常类开处理特定问题是一种很有用的方法。自己定义异常类,必须从已有的异常类中继承。
?
??????
?
?
?
????? 当可能出现或出现异常了之后我们该怎么办?
?????<异常处理机制>:
??????????????? Java提供给了我们一种处理程序错误(即异常事件)的机制。计算机语言中的异常处理理论上有两种基本模型,一种是终止模型,另一种是恢复模型,Java支持终止模型,但实际使用的时候可以通过将try块放到循环语句中,来最终得到恢复异常的作用。
??????????????????????Java程序在执行的过程中如果出现异常事件,可以自动生成一个异常类对象。该对象封装了出现的异常事件的信息并将它提交给Java的运行时系统,这个过程叫做抛出(throw)过程。
????????????????????? 当Java运行系统接收到异常对象,会寻找能处理这异常的代码,并将当前异常交给它处理,这过程叫做捕获(catch)异常。
?
????????异常相关的关键字:
?????????????? 一共有5个3组,分别是throw,throws,try,catch,finally,其中try,catch,finally要一起用。
???????????????????? 先说throws关键字:我的理解是,throws起异常说明作用,即同某种优雅的方式告知类方法使用者(可能是自己也可能是客户端程序员)该方法可能抛出的异常。它属于方法声明的一部分,紧跟着形参列表后面。每个方法可以抛出一个或几个不同的异常类。一个方法使用throws抛出了一个异常,说明该方法不会对出现的错误或者异常进行处理,而是将之抛向上一级,即调用这个方法的方法,包括main方法。如果在main方法中抛出了异常,通常是交由JVM来处理。throws关键字的使用如下:
public void someMethod( ) throws IOException{ System.out.println("抛出了一个IO异常"); throw new IOException( ); }
???????????????????? throw关键字:通过上面的例子代码我们可以看到throw语句的作用是抛出一个具体的Exception对象(而throws指抛出一个Exception类),这个对象通常封装了出现异常的具体信息。
?
??????????????????? ?try、catch、finally关键字: 这三个关键字要连在一起用,它们构成了java中的异常处理程序,其使用形式如下:
try{ //语句块 //包括可能出现异常的语句代码 }catch(Type1 id1){ //处理Type1类型的异常对象id1的语句代码}catch(Type2 id2){ //处理Type1类型的异常对象id1的语句代码}fianlly{ //语句块 //不论try语句块中是否出现异常,都必须执行}
??????????????????? 有例子可知,一个try语句块后面可以跟多个catch语句,不同的catch语句处理可能抛出的不同异常。当try块中某个语句出现了异常时,程序自动跳到捕获该异常的catch对象,而不论try语句块是否执行完毕。一旦catch子句结束,则处理程序的查找过程也就结束。注意:只有与出现错误相匹配的catch子句才能得到执行,这与switch语句不同,switch语句需要在每个case子句最后加上一个break,来避免执行后面的case子句。
??????????????????? 当涉及break和continue语句的时候,finally子句也会得到执行。
????????????????????
?
?