Exception获取异常信息的区别
- 一、异常的一些基本概念
- 二、异常捕捉
- 三、异常处理之finally
一、异常的一些基本概念
Java把异常当作对象来处理,定义一个基类(),它是所有异常类的父类。
Java提供了两种错误异常类,分别为Error类和Exception类,并且它们都有相同的父类Throwable类。
Error类发生在程序运行期间,这类错误不可恢复的,一旦发生就会终止程序执行。且编译器是不会检查Error是否被处理,因此,在程序中不推荐捕捉Error异常的。
Exception类表示可恢复异常,编译器可以捕捉到。它有分为两类:检查异常(check exception)和运行异常(runtime exception)。
二、异常捕捉
Exception是异常处理类,它除基类(Throwable类)以外最大的异常类,即其他异常处理类的父类,将会被子类继承。因此我们在捕捉异常时不清楚具体是那个类出现异常,我们可以使用try/catch去捕捉,保证程序能正常运行,调用具体方法打印出捕捉结果,catch中的代码只有在出现异常时才会运行,try里面是我们自己编写的业务逻辑代码。
- printStackTrace()方法:打印出所有与之相关的异常出处,换句话说就是不仅打印出异常名字还是显示出位置。便于程序的调试。
- getMessage()方法:打印出具体异常的名字。不显示具体位置,不方便调试程序。
try {
for (int i=0;i<;i++){
File file2=new File(images[i].getOriginalFilename());//图片保存为jpg格式
images[i].transferTo(file2);//将上传文件保存到目录文件
}
}catch (Exception e){
(); //不仅打印出异常名字还是显示出位置
//(); //打印出具体异常的名字。不显示具体位置,不方便调试程序。
return ((),(),"上传失败!");
}
三、异常处理之finally
java语言的异常处理中,finally块的作用是保证无论出现什么情况,finally块中的代码都被实现。return语句表示结束当前函数的调用,因此任何语句的执行都是在return语句前(除非遇到exit函数,exit函数表示强制退出)。所以finally块也是在return语句前执行的。此外,若try-finally/catch-finally中都包含有return语句,则finally块的中return会覆盖try或catch的中的return语句。
try {
return 1; //将会被finally里面的return语句覆盖
}catch (Exception e){
return 2;
}finally{
("exe finally!");
return 3;
}
*结果:
exe finally!
3 //表示finally里面的return语句覆盖了其他地方的return语句。
由于在一个方法中定义的变量都是存储栈中,所以当这个函数结束后,其对应的栈也就被收回收了,此时在其他方法体里面的变量就将不存在了,因此return在返回时不是直接返回变量的值,而是复制了一份,然后返回。所以对于基本类型的数据,在finally块中返回值不受影响,但对于引用类型是受影响的。因为程序在执行到return是会先将返回值放到一个指定的位置,其次再去执行finally块里面是代码,就算修改定义基本类型的变量的值也不会影响返回值。但是引用就不一样,因为引用类型保存的不是值,而是存储的位置,因为在finally块中改变其值后,在返回时返回值就收到影响。return返回值返回的是事先存放到指定位置的值或引用的值。
//基本数据类型:不受影响
public static int doInt(EnumPractice s) {
int a=1;
try {
a=2;
return a;//将会被finally里面的return语句覆盖
} catch (Exception e) {
return 0;
} finally {
a=3;
("exe finally1 !");
}
}
*执行结果:
exe finally1 !
2 //表示finally里面的return语句基本数据类型返回值不受印象。
//引用类型:返回值受finally块影响
public static StringBuffer doStringBuffer() {
StringBuffer s=new StringBuffer("自律让人");
try {
return s;//将会被finally里面的return语句覆盖
} catch (Exception e) {
return null;
} finally {
("更优秀 !");
("exe finally2 !");
}
}
*执行结果:
exe finally2 !
自律让人更优秀 ! //返回值受finally块代码影响