今天给大家讲一讲Java当中的异常。说到异常,其实并不陌生,我们之前在讲debug的时候,曾经有过提及。当我们的程序遇到问题的时候,就会出现异常。不被处理的异常会被输出在屏幕上,相信大家也都见过了,就像这样:
我们都知道,如果程序运行遇到异常,程序就会中断,并且把异常信息输出在屏幕上。但是并不是所有的时候都允许程序crush的,打个比方说,ATM取钱的系统,要求用户输入的是整百的金额,但并不是所有用户都会按部就班输入整百的数字,一定会有错误的情况。如果一发生错误系统就崩溃,那ATM就用不了了,显然这是不能被接受的,这个时候就需要我们对异常进行处理。
try catch
我们可以用try catch操作对异常进行捕获。这里关于异常的捕获、抛出不太好理解,其实很简单。
try语句就像是保险,在保险内执行的代码,即使代码出错了,会被保险hold住,而不会引起整个程序的崩溃。而这个会引起程序崩溃的错误会被保险捉住,让程序员可以得知究竟是什么错误。
写成代码大约是这样:
try {
...
}catch(Exception e) {
...
}
Exception是一个异常的基类,基类是面向对象当中的术语,我们还没有讲到相关知识,可以简单地理解成比较笼统的类别。就比方说如果狗是一个基类的话,狗往下细分会有很多品种,比如斗牛犬、雪橇犬、田园犬等等。同样异常也是一样,总的叫做异常,异常往下还有很多细分,比如空指针的异常:NullPointerException, 数组越界的异常: ArrayIndexOutOfBoundsException 等等。
所以整个流程就是,在try中执行可能会出错的代码,如果执行的过程中出错了,那么就会进入到catch包括的代码块中。
我们来尝试一波:
可以看见,程序成功地执行了,没有任何异常信息,并且catch当中的代码被执行了,说明在try的代码当中出现过错误。
你可能要问了,但是这样我还是不知道出现过哪些错误啊?
没关系,Exception当中集成了一些方法,可以让我排查问题。
getCause
可以获得出现异常的原因,比如刚才的场景当中是空指针导致的,我们输出异常的cause,发现屏幕上输出了null,说明是由空指针导致的。
printStackTrace
可以打印整个报错的堆栈,就像之前我们没有捕获异常之前那样: