异常

异常类型

异常就是在运行时产生的问题。在Java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位置)。

异常的根类是java.lang.Throwable

异常类可以进行如下分类:

  • 根据Exception异常进行分类,可分为运行时异常非运行时异常
    • 运行时异常:运行时异常是可能被程序员避免的异常。它描述的是程序设计错误,例如,错误的类型转换、访问一个越界数组或数值错误。运行时异常通常是由Java虚拟机抛出的。与检查性异常相反,运行时异常可以在编译时被忽略
    • 非运行时异常RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOExceptionSQLException等以及用户自定义的Exception异常,一般情况下不要自定义检查异常。
  • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的

还可以分为受检异常(checked exception)和免检异常(unchecked exception):

  • 受检异常:Java语言会强制要求编码者检查处理的异常,类Exception和任何不属于RuntimeException的子类的子类都是受检异常;
    • 用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略
    • 编译器会强制程序员检查并通过try-catch块处理,或者在方法头进行声明。
  • 免检异常:Java语言不强制要求编写代码捕获或声明的异常,ErrorRuntimeException以及它们的子类都是免检异常。

异常处理

Java的异常处理模型基于三种操作:声明一个异常、抛出一个异常和捕获一个异常:

声明异常-throws

每个方法都必须显式声明它可能抛出的必检异常的类型(不必显式声明Error和RuntimeException等免检异常):
public void myMethod() throws IOException, Exception1...

抛出异常-throw

检测到错误的程序可以创建一个合适的异常类型的实例并抛出它,这就称为抛出一个异常:
throw new IllegalArgumentException("Wrong Argument");

捕获异常

如果在执行try块的过程中没有出现异常,则跳过catch子句。如果try块中的某条语句抛出一个异常,Java就会跳过try块中剩余的语句,然后开始査找处理这个异常的代码的过程。

除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally子句总是会被执行的。

posted @ 2021-03-10 14:52  chenzufeng  阅读(180)  评论(0)    收藏  举报