Java 基础之异常

  • Java,基础,异常

Java 里的异常是指程序出现了非正常的状态,以至于程序不能按照原先设计的逻辑继续执行下去,而需要找到处理异常的代码,如果没有能够处理改异常的代码,最终会导致程序提前结束。

异常不是 bug 但是异常经常会导致 bug

首先,异常和 bug 不是一会事,bug 是程序没有按照预先设想的需求去运行,这个误差出现在编写程序的时候,也就是在设计代码,编写代码的时候出现的错误。而异常是程序运行过程中发生了一些程序本身不可预知的错误。是程序本身不可预知的非正常情况,不是程序员不可预知,比如网络链接的过程中突然断网了,这个问题程序本身不可预知,也处理不了,但是程序员可以处理,当然处理不是指把网连上了,处理是指程序员事先设计好网络断开的情况下,程序应该哪些事情。异常机制就是让程序员在设计代码的时候处理好这些问题的。异常处理没有处理好,往往就成了 bug 了。比如产品的需要是输入 a 和 b 两个数字,输出 a 除以 b 的结果,本来 1 除以 1 等于 1 , 但是你的程序给出的结果是 2 ,那么就是你程序的 bug 。那异常呢,就是输入了 1 除以 0 ,这时候程序会抛出一个异常,那么你需要去捕获这个异常,并且提示用户 0 不能当成除数,符合产品经理的需求,那么这个属于正常的。如果你没有处理呢,程序就崩溃了,提前结束了,那产品经理肯定不干了,这就是 bug 了。

Throwable Exception Error

在 Java 里,异常类是 Exception ,位于 java.lang 包里,它继承于 Throwable 类,同样继承于 Throwable 的还有 Error 。大部分时候我们把注意力集中在异常上,只有小部分情况下,我们需要去关心错误。

  • Throwable 意思是可抛出的,看名字很像是一个接口,但其实他是一个类,而且不是抽象类。Throwable 是 Exception 和 Error 的父类,所有的异常和错误都是它的子类。
  • Exception 异常。咱们讨论的重点,这里罗嗦了。
  • Error 错误。一般可以认为,错误是非常严重的异常,虽然不是很恰当,但确实可以这么理解。错误一般是由虚拟机发生的,并且可能是致命的问题,比如内存溢出错误OutOfMemoryError。当然这不是绝对的,因为 Error 毕竟是 Throwable 的子类,只要是 Throwable 的,都是可以被 catch 的,所以你可以捕获到这个错误,当能捕获到后能不能处理就是问题的。像内存溢出,如果你在申请一块内存的时候发生了内存溢出,说明你的程序占用超出了规定额度的内存,如果你捕获了那个错误,那么你剩下的事情就是要么啥也不做,也不要再申请内存了,要么就是赶紧释放一下内存,把能释放的释放了,让虚拟机回收,虽然不能解决内存不够的问题,但至少能让程序不被虚拟机杀掉。一般对这种错误的捕获只会在申请大块内存上,比如在 Android 上创建 Bitmap 对象的时候,如果你连申请一个普通对象的内存都不够的话,那么离死不远了。

异常的子类

  • 运行时异常。 异常有一个重要的子类 RuntimeExceptionException ,运行时异常,运行时异常是不检查异常。也就是在编译的过程中,编译器不会去检测的异常。一般运行时异常和Error被统称为非检测异常,就是编译器不会检测的异常。

  • 编译异常 与运行时异常不同,编译异常是编译器在编译的过程中会检测的异常。如果编译器检测到在代码里有未捕获的编译时异常,那么会编译不通过。一般来说,编译异常都是显示的声明的,所以编译器知道哪些地方会抛出什么样的异常。比如你调用的方法声明了会抛出某个异常(非运行时异常及其子类),那么在你调用该方法的语句块里,就不需要对它进行捕获。编译异常一般也叫可检测异常。

- EOF -

本文链接 https://binkery.com/archives/435.html,欢迎转载,转载请注明出处。