说到异常,java程序中总会有些意想不到的状况所引发的错误,java中的错误也会以对象的方式呈现,都是java.lang.Throwable的各种实例子类。java言称“万事万物皆为对象”,当然错误也可包装为对象,只要你能捕捉包装错误的对象,就可以针对该错误做一些处理。
异常机制
异常机制就是指当程序中出现错误时,程序将如何处理的。具体来说,异常机制提供了程序退出的安全通道。当出现错误时,程序的执行流程发生改变,程序的控制权交给异常处理器。
通俗的讲,就是为了让程序继续执行下去,而不至于中断。
程序错误
程序错误一般分为三种:
- 编译错误:程序没有遵循语法规则,编译程序能够自己发现并提示我们找到错误的位置和发现错误的原因。
- 运行时错误:程序在执行时,运行环境发现了不能执行的操作。
- 逻辑错误:程序没有按照预期的逻辑顺序执行。
常见的异常
异常名称 | 异常描述 |
---|---|
java.lang.NullPointerException | 空指针异常:对象为空,并且调用了相应方法 |
java.lang.ClassNotFoundException | 找不到指定类 |
java.lang.ArrayIndexOutOfBoundsException | 数组下标越界 |
java.lang.NumberFormatException | 数字格式化异常 |
java.lang.ArithmeticException | 数学运算异常 |
java.lang.StackOverflowError | 内存空间溢出错误,方法递归调用中经常发生 |
java.lang.ClassCastException | 类型转换异常,向下转型经常发生 |
java.util.InputMismatchException | 输入类型不匹配 |
java.text.ParseException | 时间格式化异常,SimpleDateFormat中经常发生 |
异常继承架构
提示:上图中的ReflectiveOperationExceptions是JDK7之后新增的类,JDK之前ClassNotFoundException等类是直接继承自Exception类。
错误被包装成对象后,这些对象都是可抛出的,因此设计错误对象都是继承自java.lang.Throwable类,Throwable定义了取得错误信息、堆栈追踪等方法,它有两个子类:java.lang.Error和java.lang.Exception.
异常Exception类总共有两大类:
- 受检异常
- 非受检异常·
Error与其子类实例代表严重系统错误,如一些硬件层面错误、JVM错误或者内存不足等问题。虽然可以使用try、catch来处理对象,但是不建议,发生严重系统错误时,java程序本身是无力回复的。举例来说,如果JVM所需内存不足,如何写程序要求操作系统给予JVM更多的内存呢?当Error对象抛出时,基本上不用处理,任其传播到JVM为止,或者是最多留下日志信息。
单就语法与继承架构上来说,如果某个方法声明抛出了Throwable或者子类实例,只要不是属于Error、java.lang.RunTimeException或者其子类实例,就必须明确使用try、catch语句法加以处理,或者用throws声明这个方法会抛出异常,否则编译失败。