# (一)Java中的异常 {#一-java中的异常}
Java中的异常都来自于java.lang.Throwable类,从异常类型上分,Java中的异常可以分为Exception和Error。Exception异常可以被程序本身处理,Error无法被程序处理。
Exception异常又可以分为受检查异常和不受检查异常,所谓受检查异常是指那些在编程期间就需要把异常try/catch或throws出来的异常,不受检查异常是指在编程期间不需要通过代码来显式地catch出来。我画了个图展示异常的类型:
# (二)如何处理异常 {#二-如何处理异常}
Error类型的异常属于尽量去避免而非在代码里去处理的异常,因此我们在处理异常章节主要介绍Exception类型的异常。
不受检查异常往往是程序员的代码逻辑疏忽导致,比如空指针异常,只需要在调用对象之前判断是否是空对象就可避免;下标越界异常只需要保证永远在下标范围内访问即可避免。
受检查异常必须在代码中通过try/catch或者throws才能通过编译,比如下面这段读取文件的代码:
public class ExceptionTest{
public void readFile() throws FileNotFoundException {
FileInputStream fileInputStream=new FileInputStream("xxx.text");
}
}
当使用new FileInputStream("xxx.text")获取文件时,FileNotFoundException属于受检查异常,就必须抛出或者被捕获。除了throws之外,还可以使用try/catch
public class ExceptionTest{
public void readFile() {
try {
FileInputStream fileInputStream=new FileInputStream("xxx.text");
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
}
}
}
# (三)try/catch与throws的区别 {#三-try-catch与throws的区别}
受检查异常的捕获有两种方式:try/catch和throws。区别在于,try/catch捕获到异常后直接在catch语句块里进行处理,处理完成之后程序继续往下执行。而throws则是将异常抛给它的上一级进行处理,程序就不会再往下执行了。
使用catch捕获到异常之后,我们可以对异常进行处理,常见的方式就是将异常打印出来或者写入到日志里。下面是Throwable类中的常用方法。
public String getMessage() //返回异常的简要信息
public String getLocalizedMessage() //返回异常的本地化信息,默认和getMessage是一样的,如果要加入本地化信息往往是子类重写这个方法
public String toString() //返回异常的更详细信息
public void printStackTrace() //在控制台输出异常信息。
try/catch之后往往还会更finally语句块,finally语句块中的代码会在程序处理完成最后被执行,不管是否进入异常。如果在代码块中有return语句,在return执行之前,finally语句块中的代码会被先执行。 finally 语句的返回值将会覆盖原始的返回值。
# (四)自定义异常 {#四-自定义异常}
除了使用Java自带的异常之外,我们还可以自己定义一些异常,自定义异常比较简单,继承Exception或者RuntimeException,通过构造方法将异常信息通过super返回。
public class MyException extends Exception{
public MyException(){
super();
}
public MyException(String message){
super(message);
}
public MyException(String message,Throwable cause){
super(message,cause);
}
public MyException(Throwable cause){
super(cause);
}
}
# (五)总结 {#五-总结}
代码功力再强大,也有碰到异常的时候,合理作好异常处理可以让你代码更稳定,也更容易排查问题。我是鱼仔,我们下期再见。