常见的异常:
①RuntimeException:Exception :异常层次结构的根类;ArithmeticException:数学计算异常;ArrayIndexOutOfBoundsException:数组越界异常;NullPointerException:空指针异常;NegativeArraySizeException:负数组长度异常;ClassCastException:造型异常;NumberFormatException:数字转化格式异常;IllgalArgumentException:非法参数值异常;IllegalStateException:对象状态异常,如对未初始化的对象调用方法;InterruptedException:线程中断;UnsupportedOperationException:对象不支持的操作异常,如调用方法名、方法参数写错等。②IOException:FileNotFoundException:指定文件未找到异常;EOFException:读写文件尾异常;MalformedURLException:URL格式错误异常;SocketException:Socket通信异常。③其它异常:ClassNotFoundException:无法找到需要的类文件异常。
throws:并没有真正的处理异常,只是骗过编译器。
a) 逐层的上抛异常,直到main方法。如果main中仍没有处理,程序会被异常中断。
b) throws中断了本层的代码。
c) throws运行时异常没有意义
要想积极的处理异常,用try-catch-finally:
try{// 出现1次
// 可能出现异常的代码
}catch(异常对象){// 出现0-N次 多次的时候小的写上面,大的写下面,异常时从上到下逐步的捕获的。
// 捕获到对应异常对象之后所做的处理。
}finally{// 出现0-1次,没有catch时finally一定要有。
// 一定会执行的代码
}
对于编译时异常:
一般都是try-catch-finally处理掉。方法中可以不处理,用throws上抛,最终抛到了main,main方法中禁止用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()代码块中来执行。可以通过Exception的getMessage()方法来获得异常的详细信息或者通过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 ...");