每日一题:Java异常处理

什么是异常

在理想状况下,程序总会运行在很完美的环境中,网络不会终端,文件必定存在,程序不会有 BUG。可是,理想很丰满,现实很骨干,实际生产环境中,网络可能会中断,文件可能会找不到,内存可能会溢出,程序可能会有 BUG。而这些意料以外的状况就是异常。java

在未处理的状况下,异常会致使程序没法继续执行,从而影响软件总体的功能,但这是多数状况下不容许的,因此咱们须要在程序中将可处理的异常处理掉,至少保证当前任务能够安全退出。安全

Java 异常

Java 异常体系中,Throwable 为超类,其子类包括 Error 和 Exception 两类,Error 主要包括 JVM 自己的问题,这一类问题不多出现且没法被程序所解决,因此代码中能够不考虑此部分。网络

Java 异常体系将异常分为检查异常(checked exception)和未检查异常(unchecked exception)。日志

未检查异常也可叫作运行时异常,由于其在 Java 异常体系中仅包含 RuntimeException,主要包括代码编写时人为由于作成的异常,而这些异常在代码编译阶段没法发现,常见的有 IndexOutOfBoundsException、NullPointerException 和 IndexOutOfBoundsException 等,当出现未检查异常时可肯定是代码 BUG。code

检查异常包括除 RuntimeException 之外的全部异常,常见的主要为 IOException 和 SQLExcetion 两类,此部分异常虽然可能为人为形成,但在代码编译阶段就能够被编译器发现,因此须要在代码中作好相应的处理。继承

Java 异常处理

对应异常体系,Java 提供了异常处理机制,经常使用的关键字有 try、catch、finally、throw 和 throws。内存

try、catch 和 finally 的用法比较简单,只须要符合标准语法便可,try 对代码块进行监听,当出现异常时 catch 捕获异常进行异常处理,最后执行 finally 代码块。须要注意几个点:资源

  • 是不管是否出现异常,finally 代码块是必定执行,且在最后执行
  • catch 能够出现屡次,但出现屡次时须要注意异常的父子级关系,后面的异常不能为前面的子类
try{
    // 代码块
} catch (异常){
    // 异常处理代码
} finally {
    // 须要确保必定执行的代码,例如关闭流资源占用的代码
}

throw 和 throws 比较容易混淆。throw 用于在代码中手动抛出异常,而 throws 则用于在方法签名后声明须要抛出的异常,涉及到继承关系时,子类方法抛出异常时,父类方法必须抛出异常,不能为子类异常的子类且数量不能少于子类,代码结构以下:编译器

public void testMethod() throw Exception{
    throw new RuntimeException();
}

Java 异常的使用建议

  • 仅当有须要或者能处理时对异常进行捕获,不然将异常抛向调用者,直至到与页面进行交互时统一处理或记录日志
  • finally 代码块建议只用来释放占用的资源,不要用来处理业务逻辑
  • 不要经过异常处理机制处理 RuntimeException,由于此类异常能够经过修改代码来解决,同时增长程序的健壮性
  • 异常处理记录日志时记录对问题排查有用的信息,没法肯定时则将异常堆栈信息及方法运行参数记录下来
  • catch 捕获异常时粒度尽量,例如捕获 FileNotFoundException 时不要用 IOException 代替
  • try 监听的代码尽量少,不要将整个方法体都放在 try 语句中
相关文章
相关标签/搜索