“欲渡黄河冰塞川,将登太行雪满山。” 系统运行,风云不测,睹始知终,秋去冬来,一叶落而知秋。

灵魂三问:

  1.  哪里发生了异常?
  2.  谁来处理异常?
  3.  如何处理异常?

       首先需要明确异常在哪里发生,在代码中是通过try-catch来发现异常的,但是有些程序员将大段代码定义在一个try-catch语句块中,这样非常不便于定位问题,是一种不负责任的做法。捕获异常时,要分稳定代码,和非稳定代码;

  • 稳定代码:无论如何都不会发生异常的代码;例如 int a = 0;
  • 异常捕获:针对非稳定的代码,捕获时要取分异常类型,并做相应的处理;

     其次,判断谁来处理异常,先区分 throw 和throws的区别:

  • throw : 方法内部抛出具体异常类对象的关键字
  • throws:  (1)作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理;(2)主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。(3)出现异常是一种可能性,但不一定会发生异常。

了解了throw和throws的区别后,再来判断当前捕获的异常是否需要自己处理,如果异常在当前方法的处理范围之内,且没有必要对外透出,那么就直接捕获异常并做相应的处理,否则向上抛出,由上层方法或者框架来处理。

异常分类结构

                                         Java 异常处理机制

try 代码块 

   Try—catch—finally 是处理异常的三部曲;但是不能只有try这个光杆司令;

  • try代码块:监视代码执行过程,一旦发生异常则直接跳转至catch,如果没有catch,则直接跳转至finally;
  • catch代码块:可选执行的代码块,如果没有任何异常发生,则不会执行,如果发生异常则进行处理或向上抛出,这一切都在catch代码块中执行。
  • finally代码块:必选执行的代码块,不管是否异常发生,即使发生 OutOfMemeryError也会执行,通常用于处理善后的清理工作;

注意:

 (1)finally是在return表达式后执行的,此时简要return的结果已经被暂存起来,待finally代码块执行后将暂存的结果返回;

 (2)不管程序代码块是否处于try块中,甚至包括catch块中代码,只要执行该代码时出现了异常,系统都会自动生成一个异常对象,如果程序没有为这段代码定义任何catch块,java运行环境肯定找不到处理该异常的catch块,程序肯定在此退出。

(3)try块后可以有多个catch块,try块后使用多个catch块是为了针对不同异常类提供的不同的异常处理方式。当系统发生不同意外情况时,系统会生成不同的异常对象,java运行时就会根据该异常对象所属的异常类来决定使用哪个catch块来处理该异常。

(4)通常情况下,如果try块被执行一次,则try块后只有一个catch块会被执行,绝不可能有多个catch块被执行,除非在循环中使用类continue开始下一次循环,下一次循环又重新运行了try块,这才可能导致多个catch块被执行。

(5)进行异常捕获时,一定要记住先捕获小的异常,再捕获大的异常

 

相关文章:

  • 2022-01-18
  • 2021-11-06
猜你喜欢
  • 2021-12-19
  • 2022-01-16
  • 2021-09-26
  • 2021-05-29
相关资源
相似解决方案