编程在于折腾

理清Java异常(1)

本文于1369天之前发表,文中内容可能已经过时。如有疑问,请在评论区留言。

说(fa)在(fa)开(lao)头(sao)

为什么要写这篇博文?在完成Java面向对象程序设计的综合性实验过程中,使用到了文本IO和二进制IO。写过这部分代码的人都知道,IO难免会跟异常打交道。但在完成之后,却迷迷糊糊的,在需要处理异常的时候,总是按照IDE(使用的是NetBeans)的提示来处理异常,却不知道为什么要这样,为什么不要这样。很不喜欢这感觉,所以,就逮住这个机会来“更新”脑中的知识。哈哈,不知道我能将异常学到几成,又能清楚地说出几成。说得不对的地方,还希望看到这篇文章的人能够好心指出,谢谢~

参考资料 > 1.Java语言程序设计(基础篇) 2.尚学堂马士兵的Java视频教程

异常的概念

异常是程序在运行时的错误。

设计良好的程序应该在异常发生的时候提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或者产生不可遇见的结果。

还有一个好处在于,程序员应该对可能抛出的异常进行处理,而不是让异常直接抛出给使用的用户,专业的异常术语可能导致用户不好的体验,所以应该进行处理,可以进行更加易懂或者说是友好的提示。

异常的分类

打开Java API的异常类,即Throwable类,可以看到有两个直接的子类(为什么是直接的子类?因为用户可以自定义自己的异常类)

  • Throwable 所有异常类的根
    • Error(系统错误) 不需要处理,也处理不了。描述的是内部系统的错误,由Java虚拟机抛出,很少会发生,一旦发生,只能通知用户以及尽量稳妥地终止程序。
      • LinkageError
      • VirtualMatchineError
      • ……
    • Exception(异常) 错误或异常能被程序捕获和处理。描述的是程序和外部环境所引起的错误。

      • ClassNotFoundException等 其他异常
      • RunTimeException(运行时异常) 在Exception类中比较特殊的子类。描述的是程序设计错误,异常由Java虚拟机抛出。常见情况有:错误的类型转换,数组下标越界等。
异常的大概分类简单类图

异常的大概分类简单类图

为什么要这样分?

Exception中,为什么要特意说明RunTimeException?让我们来理清一下吧。 > Error和Exception的子类–RunTimeException 以及它们的子类都称为免检异常,在程序中的任何一个地方都可能会出现,为避免过多使用try-catch块,不要求在代码中强制处理(有两种方式,try-catch块或者在方法头throws声明并在方法中抛出)。

前者Error是因为“系统出错,无法处理”的原因免检,而后者RunTimeException是因为在程序中的任何地方都可能出现,如果都处理,会增加许多代码(Error免检也有这个原因),试想,如果每次数组访问或者算术运算都必须处理,那还不累死人?!所以,Java语言不强制要求编写代码捕获声明异常。但其他异常则需要处理。

总结 >- 异常是程序在运行时的错误 >- Throwable是所有异常的父类。其有两个直接的子类–Error和Exception,其中Exception中有一个特殊的子类–RunTimeException,它和Error是免检异常,Java不强制要求处理免检异常。

理清Java异常(2)

  1. 1. 说(fa)在(fa)开(lao)头(sao)
  2. 2. 异常的概念
  3. 3. 异常的分类
    1. 3.1. 为什么要这样分?