前言:在代码生产中 避免不了的就是异常的出现 异常分为可控异常和不可控异常,可控异常是在我们控制之内可以出现的异常并且不会影响程序的运行,不可控异常通常是我们还没有检测出来的错误,我们不能让其直接暴露在前端用户界面。所以我们要进行异常的处理
声明异常Throws
声明异常是指将问题标识出来,报告给使用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
声明异常格式:
~~修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。也可以只声明一个父类异常也就是Exception
Try…Catch
Try …Catch 是自己处理异常
格式:
try{
//可能产出异常的代码
}
catch(定义一个异常的变量,用来接收try中抛出的异常对象){
//添加异常处理逻辑:异常产生后怎么处理异常对象
//一般工作中对将异常信息记录到一个日志中
}
......
catch(异常类名 变量名){
}
注意:
1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
3.如果try中没有 产生异常 那么就不会执行catch中的异常处理逻辑
Finallly
有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
public class TryCatchDemo4 {
public static void main(String[] args) {
try {
read("a.txt");
} catch (FileNotFoundException e) {
//抓取到的是编译期异常 抛出去的是运行期
throw new RuntimeException(e);
} finally {
System.out.println("不管程序怎样,这里都将会被执行。");
}
System.out.println("over");
}
注意:
1.finally不能单独使用,必须和try一起使用
2.finally一般用于资源释放(资源回收),无论程序是否异常,最后都要资源释放(IO)
3.finally中避免写入return语句
Throwable中定义的三个异常处理的方法
public String getMessage()
:获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。public String toString()
:获取异常的类型和异常描述信息。public void printStackTrace()
:打印异常的跟踪栈信息并输出到控制台。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。*