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捕获到异常后直接在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); } }(五)总结
代码功力再强大,也有碰到异常的时候,合理作好异常处理可以让你代码更稳定,也更容易排查问题。我是鱼仔,我们下期再见。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)