Java之异常

177 阅读3分钟

异常分类

  • java.lang.Exception
    • 编译时异常(受检异常)
      • IOException
      • ClassNotFoundException
    • 运行时异常(非受检异常)
      • NullPointerException
      • ArrayIndexOutOfBoundsException
      • NumberFormatException

异常的处理:抓抛模型

过程一:程序在执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。一旦抛出对象以后,其后代码不在执行。

过程二:可以理解为异常的处理方式:

  • try-catch-finally
    • 使用try将可能出现异常的代码包起来,在执行过程中一旦出现异常,生成一个对应异常的对象,根据此对象对应的异常类型去catch中匹配异常
    • catch中处理异常一般用String getMessage或者printStackTrace()
    • finally中写必须要执行的代码。比如在try中return或者在catch中再次出现异常则会导致不写finally的代码不会得到执行。像数据库连接、输入输出流、网络编程socket等资源,JVM不能自动垃圾回收,因此需要手动释放资源,此时的资源释放就需要声明在finally中。
    • 使用这种方式处理异常可以使编译时异常转换为运行时异常,但针对运行时异常就不需要这种方式处理异常了
  • throws
    • throws + 异常类型写在方法的声明处指明此方法执行时,可能会出现的异常类型。一旦出现异常仍然会生成一个异常对象,此对象类型满足声明的异常类型时,就会被抛出,异常后面的代码就不再执行。try-catch-finally真正将异常处理掉了,throws的方法只是将异常抛给了方法的调用者,并没有将异常处理掉。
  • 选择的问题
    • 子类方法抛出的异常小于等于父类方法中抛出异常。
    • 父类中被重写的方法没有throws抛出异常,子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally的方式处理
    • 执行的方法a中,先后调用了另外的几个方法,这几个方法是递进执行的,建议这几个方法使用throws抛出异常,而方法a可以使用try-catch-finally的方式处理异常

throw和throws的区别

异常的处理可以用抓抛模型来解释。抓的过程主要有两个,一个是程序在执行过程中出现异常,系统自动生成异常类对象,其后代吗不再执行。还有一个过程其实我们可以自己手动抛出异常,即手动生成一个异常对象并抛出。此为throw。

而throws对应抓抛模型的抓过程,即将抛出来的异常,无论手动还是系统自动出来的异常,向上抛给方法去处理。此过程对应的是异常处理的方式。