JavaSE - 异常

对于异常我们可以从字面上来理解:也就是非正常情况。Java将非正常情况分为两种:异常(Exception),错误(Error)。它们都继承Throwable类。

             

  Error错误一般指与虚拟机相关的问题,这种错误无法恢复也不可能捕获,将导致应用程序中断。

       RunTimeException:会由虚拟机自动抛出自动捕获。一般指的是代码的逻辑问题,可由程序员解决。即使我们不写异常处理机制运行时也会抛出异常。

  CheckedException:该异常必须由程序员显示捕获或抛出异常。也就是我们主要解决的异常。

  1.异常处理机制

    1):try-catch

      如果执行try里的业务逻辑时出现异常,系统自动生成一个异常对象,该对象被提交给java运行时环境,这个过程被称为“抛出异常”。

      当Java运行时环境收到异常对象时,会依次判断该异常是否是catch块异常类或其子类的实例(e instanceof ExceptionClass),直到找到合适的catch块来处理该异常,这个过程被称为“抛出异常”。注意我刚才说的依次两字,如果将Exception类放到第一个catch中,则底下的所有catch都不会被执行。所以在写代码时应遵循所有的父类异常都应该放在子类异常之后。也就是先捕获小异常再捕获大异常。

      Java7之后支持一个catch块捕获多种类型异常,eg:catch(IndexOutOfBoundsException | IOException e){}

      打开的物理资源可在finally中关闭。Java9之后,允许在try后紧跟一个对圆括号,可在其内声明必须在程序结束时显示关闭的资源,并且这些资源实现类实现了AutoCloseable或Closeable接口,那么try语句会自动关闭他们。

    2):使用throws声明抛出异常

      当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理,那么就使用throws声明将其抛出。可抛出多个异常,由逗号隔开。

    3):使用throw抛出异常

      以上两种异常处理机制是由系统生成一个异常对象。而throw则是程序员通过代码自行抛出的异常。eg:throw new RunTimeException();

      该异常同样由Java的运行时环境接收并堆catch块里的异常依次判断。

      try-catch与throw同时应用:通过日志记录异常发生的情况。传达异常信息。

    4):自定义异常类

      采用throw自行抛出的异常,我们无法得到该异常包含的有用信息。

              public class AuctionException extends Exception{
                  public AuctionException (){}
                 public AuctionException (String msg){
                       super(msg);//将该字符串传给异常对象的message属性。
                }
              }       

      

  2.异常链:在开发中,当业务逻辑层访问持久层出现SQLException异常,程序不应该把底层的异常信息反馈给用户。

       所以当持久层捕获了一个异常后接着抛出一个异常,业务层捕获这个异常同样抛出一个异常层层往上直到前端控制器通过异常处理组件来处理该异常将友好信息反馈给用户。总结:捕获一个异常接着抛出该异常,并把原始异常信息保存下来,该方法被称为:异常链。

  3.异常跟踪栈

    异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据其输出结果,开发者可以找到异常的源头,并跟踪到异常一路触发的过程。

    

 

posted @ 2020-11-18 21:47  yr66  阅读(61)  评论(0编辑  收藏  举报