常见的异常:

    RuntimeExceptionException :异常层次结构的根类;ArithmeticException:数学计算异常;ArrayIndexOutOfBoundsException:数组越界异常;NullPointerException:空指针异常;NegativeArraySizeException:负数组长度异常;ClassCastException:造型异常;NumberFormatException:数字转化格式异常;IllgalArgumentException:非法参数值异常;IllegalStateException:对象状态异常,如对未初始化的对象调用方法;InterruptedException:线程中断;UnsupportedOperationException:对象不支持的操作异常,如调用方法名、方法参数写错等。IOExceptionFileNotFoundException:指定文件未找到异常;EOFException:读写文件尾异常;MalformedURLExceptionURL格式错误异常;SocketExceptionSocket通信异常。其它异常:ClassNotFoundException:无法找到需要的类文件异常。


throws:并没有真正的处理异常,只是骗过编译器。

a) 逐层的上抛异常,直到main方法。如果main中仍没有处理,程序会被异常中断。

b) throws中断了本层的代码。

c) throws运行时异常没有意义

要想积极的处理异常,用try-catch-finally:

try{// 出现1

// 可能出现异常的代码

}catch(异常对象){// 出现0-N次 多次的时候小的写上面,大的写下面,异常时从上到下逐步的捕获的。

// 捕获到对应异常对象之后所做的处理。

}finally{// 出现0-1次,没有catchfinally一定要有。

// 一定会执行的代码

}


对于编译时异常:

一般都是try-catch-finally处理掉。方法中可以不处理,用throws上抛,最终抛到了mainmain方法中禁止用throws上抛异常。意味着main一定要处理。

对于运行时异常:可以用try-catch-finally处理,但是对效率和代码阅读都有影响,所有一般都是用if条件来使程序健壮。


try-catch-finally的工作原理:

   要监控的程序语句包含在try块中,catch中存放以合理的方式捕获和处理异常的语句,finally中主要是释放资源等。

通过try-catch语句,可以将可能出现的异常通过catch()子句捕获并在相应的地方处理,另外还可以加入一个finally子句,在finally子句中的代码段无论是否发生异常都将被无条件执行。

异常处理可以定义在方法体、自由块或构造方法中。并且,try-catch-finally语句可以嵌套使用。

将可能出现异常的代码都放在try代码块中,当然,也可以将其它的一些不会引起异常的代码也一并放到try代码块中。

catch() 从句中引入一个可能出现的异常,一个try块可以和多个catch()块配合以处理多个异常。

try块内的任何代码抛出了由catch() 子句指定的异常,则try代码段中的程序将会终止执行,并跳到相应的catch()代码块中来执行。可以通过ExceptiongetMessage()方法来获得异常的详细信息或者通过printStackTrace()方法来跟踪异常事件发生时执行堆栈的内容。

无论是否出现异常,程序最后都会执行finally代码块中的内容。finally的意义在于,无论程序如何运行,它都必然会被执行到。如果在try从句中给方法分配了一些资源(比如,数据库连接、打开一个文件、网络连接等),然后,方法出现异常,它将会抛出一个异常,方法中的未执行的代码将会中止执行,并转而执行catch()从句中的内容。这个时候,本来定义在try从句中的资源回收动作就不会执行了,这就会导致资源没有回收的情况。此时,就可以将资源回收的动作放到finally从句中来执行,无论是否会有异常发生,它都能被执行到。

  多个catch语句时,小异常写上面,大异常写下面:

int a = 2;
int b = 0;
String str = null;
try{// 可能会出现异常的代码
    a = a/b;
    str.equals("");
    // 多个catch语句时,小异常写上面,大异常写下面
}catch(ArithmeticException ae){// 捕获try中抛出的异常。当try中抛出异常被捕获到时执行这里
    ae.printStackTrace();// 打印异常对象的堆栈信息
}catch(NullPointerException ne){
    ne.printStackTrace();
}catch(RuntimeException re){
    re.printStackTrace();
}catch(Exception e){
    e.printStackTrace();
}
System.out.println("main end");

finally的用法:

int a = 2;
        int b = 0;
        try{
            System.out.println("try");
            a = a/b;// 新建文件夹
        }catch(NullPointerException e){
            System.out.println("算术运算异常");// 删除文件夹
            System.out.println("catch");
        }finally{// 最终的。一定会执行
            // 删除临时文件,关闭资源文件
            System.out.println("finally");
        }
        System.out.println("else code ...");