Java异常处理

  1. 定义:Java的异常是说程序执行过程中遇到的干扰正常的指令流程的情况。
  2. 实现类:Java实现异常,定义了相应的实现类,首先是Throwable类,它是所有异常的基类。Throwable类下面有两个类继承它,分别是Error类和Exception类。
    1. Error类,顾名思义,是错误的意思,表示的是虚拟机在运行过程中所遇到的一些错误,并不是程序所能够处理的错误,比如ThreadDeath和OutOfMemoryError等,当出现Error异常时,虚拟机就会使线程终止。
    2. Exception类,单词的意思就是异常了。这个定义的就是我们在程序中所能够处理的异常了。这些异常又分为两种类型,一般称运行时异常(RuntimeException)和非运行时异常。RuntimeExceprion继承自Exceprion,它下面还有好多子类继承它,都是一些具体的运行时遗产,比如有IndexOutOfBoundsException、NullPointerExceprion、ClassCastExceprion、ArithmeticException 、ArrayStoreException 、IllegalArgumentException、NumberFormatException 等。而非运行时异常就是处理运行时异常的其他异常了,这些异常继承自Exception,比较常见的是IOExceprion、SQLExceprion等。
  3. 运行时异常和非运行时异常的比较:非运行时异常,是必须进行处理的异常,否则会报编译错误。而运行时异常可以选择进行捕捉处理,也可以不处理,不处理的时候,就会由JVM进行捕捉处理。
  4. Java异常的处理机制:Java对异常的处理就是抛出异常,捕捉异常。也就是我们常用的try-catch-finally、throw和throws。
    1. 抛出异常:当一个方法中,出现了异常,方法就会创建相应的异常类,然后交给运行时系统,运行时系统寻找处理异常的代码。抛出异常的方法,一种是使用throw关键字,比如throw new ArithmeticException();一种是使用throws子句,比如public void method() throws IOExceprion,SQLException{}.
    2. 捕捉异常:try-catch或者try-catch-finally。关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域。Java方法在运行过程中出现异常,则创建异常对象。将异常抛出监控区域之外,由Java运行时系统试图寻找匹配的catch子句以捕获异常。若有匹配的catch子句,则运行其异常处理代码,try-catch语句结束,然后执行finally的语句,最后再执行finally后面的语句。***catch语句只能按顺序匹配,匹配到一个之后,就不再匹配后面的,因此在写catch语句时,应该将范围小的放在前面。匹配不到就交由JVM处理,但这个时候finally之后的语句就不会执行了。***finally块,顾名思义,就是最后的部分,这部分不敢异常是否会发生,都会执行的部分,除非前面的代码调用了System.exit(),退出程序或者线程死亡。
  5. 常见题目:这部分最常见的题目就是try或者catch中有return语句,问finally实在try/catch的return语句前面还是后面执行?finally中修改了try/catch的return值,对上面的返回有没有影响?finally中也有return语句,那么最后返回的是哪个?

    1. 第一个问题:这个查到不同的说法,而且说的好像还都挺有道理的,一种是在return前面返回,解释是return是程序的结束了,而finally执行了,肯定在return前面执行;另一种说法是在return后面执行,解释是return语句是分步骤的,return先执行了,然后把需要返回的值存到了一块内存中,然后执行finally语句,执行完了,就再把那个存的值返回。我比较认同第二种方法。原因就到第二个问题了。
    2. 第二个问题:finally中对return的值进行修改,比如

              int a=1;
              try {  
                      return a; 
                  } catch (Exception e) {  
                      System.out.println("a");  
                  } finally {  
                      a=3;
                  }  

      这个时候,返回的结果还是1,因为return执行后,把的一个副本存入到返回区,然后执行finally语句,这个时候对a的修改,是不能反映到存到返回去的副本中的。但是还有一种情况,就是返回的不是一个基本数据类型,而是一个对象,比如:

            StringBuffer a=new StringBuffer("hello");
              try {  
                      return a; 
                  } catch (Exception e) {  
                      System.out.println("a");  
                  } finally {  
                      a=a.append("world");;
                  }  

      这个时候返回的结果是”hello,world”,这和参数传递的值传递和引用传递的原理是一样的。

    3. 第三个问题:finally中的return语句,会执行,会把try中存到返回去的值给覆盖掉,返回的就是finally中return语句所返回的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值