Java异常分类
从大体上来看,分为俩部分:
error—错误
是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。
Exception — 异常
异常可分为运行时异常跟编译异常。
运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
难点
Java异常机制
抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。
##throw跟throws的区别:
public void test thorws Exception(){
throw new Exception();
}
从上面这一段代码可以明显的看出两者的区别。throws表示一个方法声明可能抛出一个异常,throw表示此处抛出一个已定义的异常。
try…catch…finally执行流程
正常来说,try会按循序执行的:当不存在异常时,try执行完后,在执行finally中的代码;当存在异常时,try执行到异常处,执行catch处代码块,最后执行finally。
然而,在实际中会遇到如下问题:
finally中不存在return
来看下面的代码:
package file;
public class TryCatchDemo {
public static int dd() {
int x = 1;
int y = 1;
int z ;
try {
System.out.println("try");
z = x / y;
return 1;
}catch(Exception e) {
System.out.println("catch");
return 2;
}finally {
System.out.println("finally");
}
}
public static void main(String[] args) {
System.out.println(dd());
}
}
不存在异常,结果为:
try
finally
1
同样是上面的代码,将 y = 1 ;修改为 y = 0 ;让方法抛出异常,执行代码的结果为:
try
catch
finally
2
总结:不论是否存在异常,finally会在try…catch的return前执行。
finally中存在return
在上面的代码中,在finally中添加return。
然后先来看看没有异常时的输出。
public class TryCatchDemo {
public static int dd() {
int x = 1;
int y = 1;
int z ;
try {
System.out.println("try");
z = x / y;
return 1;
}catch(Exception e) {
System.out.println("catch");
return 2;
}finally {
System.out.println("finally");
return 3;
}
}
public static void main(String[] args) {
System.out.println(dd());
}
}
结果为:
try
finally
3
同上,将代码中的 y = 1;修改为 y = 0;时方法抛出异常,得到结果为:
try
catch
finally
3
总结:不论是否存在异常,finally还是会在try…catch代码块的return前执行,返回自己代码块中的return
注意:当存在异常时,这里会输出try,是因为在try代码块中,输出语句在出现异常前,所以可以输出,反之不会输出,就跑异常了。
这个面试的时候经常考,要好好运行感受一下。