Exception printStackTrace()和getMessage()方法的区别


一、异常的一些基本概念

Java把异常当作对象来处理,定义一个基类(java.lang.Throwable),它是所有异常类的父类。

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<images.length;i++){
               File file2=new File(images[i].getOriginalFilename());//图片保存为jpg格式
               images[i].transferTo(file2);//将上传文件保存到目录文件
                }
            }catch (Exception e){
                e.printStackTrace(); //不仅打印出异常名字还是显示出位置
                //e.getMessage();    //打印出具体异常的名字。不显示具体位置,不方便调试程序。
                return ReturnMap.getMap(response.getStatus(),DateFormat.getDate(),"上传失败!");
            }

三、异常处理之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{
	  		System.out.println("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;
            System.out.println("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 {
            s.append("更优秀 !");
            System.out.println("exe finally2 !");
        }
    }
    
 *执行结果:
		exe finally2 !
		自律让人更优秀 ! //返回值受finally块代码影响
		
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值