异常指不期而至的各种状况,如:文件找不到、网络连接失败、除0操作、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程
Error 通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这类异常时,JVM 一般会选择终止线程,Exception 通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。,

- Error: 程序无法处理的系统错误 ,编译器不做检查,属于 JVM 需要负担的责任
- 由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
- Excepiton: 程序可以处理的异常,捕获后可能恢复
- 运行时异常(RuntimeException): 这些异常是非检查异常(Unchecked Exception),不可预知的,程序应该自行避免,Java 编译器不要求强制处理的异常,在编译阶段不会去检查这类异常
- 非运行时异常: 可预知的异常(Checked Exception),必须处理的异常,否则编译不能通过编译
- IO异常文件不存在打开的时候出现的异常
- SQL异常
- 自定义异常
Throwable 类常用方法
- public string getMessage():返回异常发生时的详细信息
- public string toString():返回异常发生时的简要描述
- public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
- public void printStackTrace():在控制台上打印Throwable对象封装的异常信息
常见 Exception 和 Error 的描述
RuntimeException
- NullPointerException - 空指针引用异常
- ClassCastException - 类型强制转换异常
- IllegalArgumentException - 传递非法参数异常
- IndexOutOfBoundsException - 下标越界异常
- ArrayIndexOutOfBoundsException - 数组下标越界
- NumberFormatException - 数字格式异常
- ArithmeticException - 算术异常
- MissingResourceException - 丢失资源
非RuntimeException
- IOException - IO操作异常
- FileNotFoundException
- SQLException - SQL 异常
- ClassNotFoundException - 找不到类
Error
- NoClassDefFoundError - 类定义错误
- StackOverflowError - 深递归导致栈被耗尽
- OutOfMemoryError - 内存溢出
- VirtualMachineError - 虚拟机错误
- ThreadDeath - 线程死锁
- LinkageError - 链接错误
NoClassDefFoundError的成因
- 类依赖的class或jar不存在
- 类文件存在,但是存在不同的域中
- 大小写问题,javac编译的时候无视大小写,很有可能编译出来的class文件就与想要的不一样
异常处理机制
对于Checked Exception 必须捕获或声明抛出,对于UnChecked Exception及其子类可忽略不检查
- 抛出异常: 创建异常对象,交由运行时系统处理
- 捕获异常: 在方法抛出异常之后,运行时系统寻找合适的异常处理器处理异常,若未能找到合适的异常处理器则运行时系统终止运行
try、catch、finally、throw、throws
- try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块
- catch 块:用于处理try捕获到的异常
- finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行
- throw: 抛出明确的异常
- throws: 如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常,可以在方法声明中包含一个throws子句

在以下4种特殊情况下,finally 块不会被执行:
- 在 finally 语句块中发生了异常
- 在前面的代码中用了 System.exit()退出程序
- 程序所在的线程死亡
- 关闭 CPU
关于返回值:
如果 try 语句里有 return,返回的是 try 语句块中变量值。 详细执行过程如下:
- 如果有返回值,就把返回值保存到局部变量中
- 执行 jsr 指令跳到 finally 语句里执行
- 执行完 finally 语句后,返回之前保存在局部变量里的值
- 如果 try,finally 语句里均有 return,忽略 try 的 return,而使用 finally 的return
自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可


