Java基础之异常处理Exception的一点体会
一、异常的结构划分
所有异常都继承于Throwable类,Throwable有两大子类:
1、Error类,无法捕获的异常,常见的有内存溢出等系统性错误;
2、Exception,分为检查异常和非检查异常,检查异常指编译器可以识别、发现,强制程序猿进行处理的异常,常见的有FileNotFound等;非检查异常也称运行时异常,均为RuntimeException的派生类,编译器不能识别,自然不会强制要求程序猿进行异常处理。
二、异常处理语句throws/throw、try/catch/finally
throws: 用于函数声明可能抛出的异常,将异常传播给调用者(前提:内部没有做catch捕获处理);
throw :抛出异常实例,一个函数内抛出了异常实例,要么自身catch捕获处理,要么throws传播给调用者处理;
finally :无论是否抛出异常,finally语句总是执行。
throws-throw和throw-try/catch的区别:前者指抛出了异常,未捕获,阻塞了后面的语句的执行;而try/catch后的语句是可以正常执行的。
public class ExceptionTest {
public static void display(int num) throws Exception{
//1、一个函数内抛出了异常实例,
//要么使用throws抛出交由调用者处理,要么自己catch捕获处理
if(num>9){
try{
throw new Exception("num大于9");
}catch(Exception e){ //2、自身捕获处理
e.printStackTrace();
}
}
}
public static void main(String[] args){
try {
ExceptionTest.display(56);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("第一个catch一旦捕获后,之后的catch不执行"); //display()方法已捕获,此处不执行
e.printStackTrace();
}
finally{
System.out.println("虽然此处并未捕获异常,finally仍然执行");
}
}
}
输出:
java.lang.Exception: num大于9
at exceptionPackage.ExceptionTest.display(ExceptionTest.java:9)
at exceptionPackage.ExceptionTest.main(ExceptionTest.java:19)
虽然此处并未捕获异常,finally仍然执行
三、异常链传播
假设调用关系:
method3调用method2,method2调用method1,一旦method1发生异常,会将异常向上层传播,直到遇到catch捕获处理语句,若无处理语句,将由调用线程抛出给JVM。
//method2处理异常,停止向上传播
package exceptionPackage;
public class ExceptionTest {
public static void method1() throws Exception{
throw new Exception("method1 抛出异常");
}
public static void method2() throws Exception {
try{
ExceptionTest.method1();
}
catch(Exception e){
e.printStackTrace();
System.out.println("method2处理了异常,停止了本次异常的传播.");
}
}
public static void method3() throws Exception{
// try {
ExceptionTest.method2();
/* } catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("method3处理异常");
}*/
}
public static void main(String[] args) throws Exception {
ExceptionTest.method3();
}
}
输出:
java.lang.Exception: method1 抛出异常
at exceptionPackage.ExceptionTest.method1(ExceptionTest.java:5)
at exceptionPackage.ExceptionTest.method2(ExceptionTest.java:9)
at exceptionPackage.ExceptionTest.method3(ExceptionTest.java:18)
at exceptionPackage.ExceptionTest.main(ExceptionTest.java:26)
method2处理了异常,停止了本次异常的传播.
//异常一直传播到JVM
package exceptionPackage;
public class ExceptionTest {
public static void method1() throws Exception{
throw new Exception("method1 抛出异常");
}
public static void method2() throws Exception {
// try{
ExceptionTest.method1();
// }
/* catch(Exception e){
e.printStackTrace();
System.out.println("method2处理了异常,停止了本次异常的传播.");
}*/
}
public static void method3() throws Exception{
// try {
ExceptionTest.method2();
/* } catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("method3处理异常");
}*/
}
public static void main(String[] args) throws Exception {
ExceptionTest.method3();
}
}
Exception in thread "main" java.lang.Exception: method1 抛出异常
at exceptionPackage.ExceptionTest.method1(ExceptionTest.java:5)
at exceptionPackage.ExceptionTest.method2(ExceptionTest.java:9)
at exceptionPackage.ExceptionTest.method3(ExceptionTest.java:18)
at exceptionPackage.ExceptionTest.main(ExceptionTest.java:26)