1 异常的分类
2 throw 和throws的区别
3 自定义异常
4 异常的转化(比如非运行时异常转化为运行时异常)
try{
}catch(SQLException e){
throw new RuntimeException(e)//非运行时异常转化为运行时异常
}
异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。Java异常体系结构呈树状,其层次结构图如图所示:
一 异常的分类
1、Thorwable类
Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
2.Error(错误):
一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。
3.Exception:
Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件
(1)SQLException:该异常提供关于数据库访问错误或其他错误的信息。
(2)RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类
(3)IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。
4、运行时异常和非运行时异常
(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
(2)非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
2 Throw Throws 的区别
1. throw用在函数内
throws 用在函数上
2. throw抛出的是异常对象
throws用于对异常类的声明,后面的异常类可以有多个,用逗号隔开
3 自定义异常
想要很好的运用异常光靠系统自带的异常体系是不够的,这时候我们就需要自定义异常,自定义异常是一定要继承异常体系的(Exception编译异常和runtimeException运行时异常),只有这样才能被throw和throws关键字操作。一起来看案例里吧。
package Exception;
import jdk.jshell.spi.ExecutionControl;
/*编译异常——异常的类型转换
描述李老师使用电脑上课
安全隐患为:电脑会蓝屏,电脑冒烟
*/
//异常类
class BlueException extends Exception {//蓝屏异常
BlueException(){
super();
}
BlueException(String s){
super(s);
}
}
class MaoYanException extends Exception {
MaoYanException(){
super();
}
MaoYanException(String s){
super(s);
}
}
class NoPlanException extends Exception {
NoPlanException() {
super();
}
NoPlanException(String s) {
super(s);
}
}
//电脑
class Computer {
private int state = 2;//电脑的状态
void Run() throws BlueException, MaoYanException {
if (state == 0) {
throw new BlueException("电脑蓝屏了!!");
}
if (state == 2) {
throw new MaoYanException("电脑冒烟了!!!");
}
System.out.println("电脑运行!!!");
}
void ComputerReset() {
state = 1;
System.out.println("电脑重启了!!");
}
}
//老师
class Teacher {
private String name;
private Computer notebook;
Teacher(String name) {
this.name = name;
notebook = new Computer();
}
public String toString(){
return name+"老师上课";
}
public void Prelect() throws NoPlanException {
try {//只负责检测
notebook.Run();//使用电脑上课
//传递一个异常对象给catch
} catch (BlueException B) {
//要写出蓝屏后具体的解决方法————重启
System.out.println(B.toString());//toString:返回异常信息/名字+内容
B.printStackTrace();//将此throwable和其追溯打印到指定的打印流
notebook.ComputerReset();//重启
} catch (MaoYanException B) {
/*
对于电脑冒烟这个事,老师是无法给出解决方法的所以不能在老师的类里面声明冒烟异常,但是老师可以对冒烟造成的后果进行处理
*/
System.out.println(B.toString());
Test();
//但是电脑冒烟这个问题本质上还是没有解决,因此要向外抛出老师可以传达的异常(由电脑冒烟产生的)
throw new NoPlanException("课时停止!!!");
}
}
public void Test() {
System.out.println("做练习题!!");
}
}
public class ExceptionTest {
public static void main(String[] args) {
Teacher T = new Teacher("Li");
try {
T.Prelect();
}
catch (NoPlanException N) {
System.out.println(N.toString());
Teacher t = new Teacher("liu");
System.out.println("换老师!!");
System.out.println(t.toString());
}
}
}