异常分类:

所有异常java.lang.Exception类继承的子类

Exception分为:(1)运行异常RuntimeException:NullPointerException、ClassCastException等,包括错误类型转换、数组访问越界、访问空指针;(2)检查异常CheckedException

CheckedException:

异常的基本用法_抛出异常

unchecked exception:

异常的基本用法_父类_02

2、处理异常

2.1try-catch

捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码放在try语句块中。在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常处理Q,一旦处理完成就跳出当前的try-catch结构(在没有写finally的情况下)。继续执行其后的代码。在try结构中声明的变量,出了try结构之后,就不能被调用。在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。catch中的异常类型如果没有子父类关系,则声明顺序无所谓,如果异常类型满足子父类的关系,则要求子类一定要声明在父类的上面,否则报错。 

异常的基本用法_异常类型_03

finally

捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行。finaly中声明的是一定会被执行的代码,即使catch中出现了异常,try中有return语句,catch中有 return语句等情况。finally语句和catch语句是任选的。像数据库连接,输入输出流,网络编程socket等资源,JVM是不能自动回收的,我们需要手动的进行资源的释放。此时的资源的释放,就需要声明在finally中。

2.2throws,throw

声明抛出异常是Java中处理异常的第二种方式,throwsQ+异常类型写在方法的声明处,此时此方法执行时,可能会抛出的类型。如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。一旦方法体执行时,出现异常,仍会在异常代码处,生成一个异常类的对象,此对象满足throws后异常类型是,就会被抛出。异常代码后续的代码不再执行。

eg:public Image loadImage(String s)

                    throws FileNotFoundException, EOFException

throw手动抛出异常,java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出。首先要生成异常类对象,然后通过throw语句实现抛出操作。throw的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉,而将异常交给方法的调用者的地方处理。

eg:String readData(Scanner in) throws EOFException{

while(...){

if(!in.hasNext())// EOFencountered

{

if(n <len)

throw new EOFException();

return s;

}

2.3处理unchecked异常

unchecked异常在编译时不会检查,这意味着即使你没有声明或者处理异常你的程序也会抛出一个unchecked异常,程序不会给出一个编译错误,大多数情况下这些异常的发生是由于用户在交互过程中提供的坏数据。这需要程序员提前去判断这种能够产生这种异常的情况并且恰当的处理它。unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做。uncheckedexception不用使客户端代码显式的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。充分利用JavaAPI中提供的丰富uncheckedexception,如NullPointerException、illegalArgumentException和illegalStateException等,使用这些标准的异常类而不需亲自创建新的异常类使代码易干理解并避免过多消耗内存