Java基础-学习笔记12
12 异常
异常
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常时间可分为两大类
1)Error(错误):Java 虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError(栈溢出)和 OOM(out of memory),error是严重错误,程序会崩溃。
2)Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问、读取不存在的文件、网络连接中断等等。Exception分为两大类: 运行时异常 和 编译时异常。
如果程序员认为一段代码可能出现异常问题,可以使用 try-catch 异常处理机制(ctrl+alt+t)来解决,从而保证程序的健壮性。
异常体系图
部分常见类:
异常处理方式
1)try-catch-finally
程序员在代码中捕获发生的异常,自行处理。
try{
// 可能有异常的代码
}
catch(Exception e){
// 捕获到异常时执行的语句块。由程序员自己处理。
}finally{
// 不管是否由异常发生,始终要执行finally里的代码块。
// 通常将释放资源的代码放在finally里
}
使用细节
- 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块。
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
- 如果希望不管是否发生异常,都执行某段代码,则使用finally{}。
- 可以有多个 catch 语句,铺货不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前。比如:
练习3:finally会必须执行,如果catch执行语句里有return,finally也有retrun,捕获异常时会执行catch里的return语句,但不会返回,最终执行和返回的是finally里的return。
2)throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
JVM处理:直接输出异常信息,中断程序。
如果没有显式的处理异常,默认就是throws
显式使用 throws 的使用细节:
- 对于编译异常,程序中必须处理,要么 try-catch 要么 throws
- 对于运行时异常,程序中如果没有处理,默认就是 throws的方式处理
- 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型。
- 如果子类对于编译异常进行了显式throws处理,则父类也必须显式throws处理,或者try-catch处理。
如果子类对于运行异常进行了显式throws处理,父类可以不用显式处理,因为默认也会进行 throws处理。
自定义异常
1)定义类:继承 Exception,属于编译异常;
继承 RuntimeException,属于运行异常(一般情况都是做成运行时异常,好处:可以使用默认的处理机制)。
2)throw 和 throws
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |