在理想状况下,程序总会运行在很完美的环境中,网络不会终端,文件必定存在,程序不会有 BUG。可是,理想很丰满,现实很骨干,实际生产环境中,网络可能会中断,文件可能会找不到,内存可能会溢出,程序可能会有 BUG。而这些意料以外的状况就是异常。java
在未处理的状况下,异常会致使程序没法继续执行,从而影响软件总体的功能,但这是多数状况下不容许的,因此咱们须要在程序中将可处理的异常处理掉,至少保证当前任务能够安全退出。安全
Java 异常体系中,Throwable 为超类,其子类包括 Error 和 Exception 两类,Error 主要包括 JVM 自己的问题,这一类问题不多出现且没法被程序所解决,因此代码中能够不考虑此部分。网络
Java 异常体系将异常分为检查异常(checked exception)和未检查异常(unchecked exception)。日志
未检查异常也可叫作运行时异常,由于其在 Java 异常体系中仅包含 RuntimeException,主要包括代码编写时人为由于作成的异常,而这些异常在代码编译阶段没法发现,常见的有 IndexOutOfBoundsException、NullPointerException 和 IndexOutOfBoundsException 等,当出现未检查异常时可肯定是代码 BUG。code
检查异常包括除 RuntimeException 之外的全部异常,常见的主要为 IOException 和 SQLExcetion 两类,此部分异常虽然可能为人为形成,但在代码编译阶段就能够被编译器发现,因此须要在代码中作好相应的处理。继承
对应异常体系,Java 提供了异常处理机制,经常使用的关键字有 try、catch、finally、throw 和 throws。内存
try、catch 和 finally 的用法比较简单,只须要符合标准语法便可,try 对代码块进行监听,当出现异常时 catch 捕获异常进行异常处理,最后执行 finally 代码块。须要注意几个点:资源
try{ // 代码块 } catch (异常){ // 异常处理代码 } finally { // 须要确保必定执行的代码,例如关闭流资源占用的代码 }
throw 和 throws 比较容易混淆。throw 用于在代码中手动抛出异常,而 throws 则用于在方法签名后声明须要抛出的异常,涉及到继承关系时,子类方法抛出异常时,父类方法必须抛出异常,不能为子类异常的子类且数量不能少于子类,代码结构以下:编译器
public void testMethod() throw Exception{ throw new RuntimeException(); }