异常的定义
在Java语言中,代码中出现的问题,比如语法错误,执行错误,逻辑错误等都会引起异常
异常的层次结构
Throwable 是Java语言中,所有错误或者异常的父类,它的两个子类是Error和Exception
Error是指代码中出现的严重错误,一般不能捕获,通常是JVM存在的一些先天的缺陷
Exception的出现通常不应该影响代码的继续执行(因为可以捕获异常),分为编译时异常和运行时异常
编译时异常就是在写代码的过程中就报错的,是必须要添加异常处理的(毕竟编译器都报错了)
运行时异常(RunTimeError)是只有代码运行后才能知道会不会抛异常,比如null指针异常,语法上不必非得添加异常处理(当然也是可以添加的),因为这类异常很普遍,若全处理会影响程序的可读性和运行效率
Trowable -Error 如 OutOfMemoryError 内存溢出
StackOverflowError 栈溢出
-Exception 编译时异常 除了RunTimeError以外的类 DateFormatException //日期格式化异常
ParseException //日期解析异常
IOException
ClassNotFoundException
运行时异常 RunTimeError NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException //类型转化异常
NumberFormatException//编码格式异常
InputMismatchException//输入不匹配
ArithmeticException//算数异常
异常的处理
捕获异常
//使用try-catch-finally处理编译异常时,是使得程序再编译时就不再报错,但运行时仍可能报错。
//相当于我们使用它将一个编译时可能出现的异常,延迟到运行时出现
//开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写 try-catch-finally 了。
//但是针对于编译时异常,一定要考虑异常的处理。
try{
可能出现异常的代码 1,尝试执行try代码,如果没有异常则跳过catch执行finally,
如果出现异常,则try中异常后的代码不会执行,跳到catch
}catch(异常类型1 变量名1){
处理异常的方式1 2,从前向后对比抛出异常是否符合catch的异常类型,是则进入该代码块
}catch(异常类型2 变量名2){ 不是则比较下一个catch
处理异常的方式2
}catch(异常类型3 变量名3){
处理异常的方式3
}
....
finally{
一定会执行的代码 3,执行完catch以后,再进入finally执行
像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,
我们需要自己手动的进行资源的释放,这些资源释放的代码就需要声明在finally里
}
注意点:
1,catch和finally可以省略但是至少要有一个
2,catch可以写多个分别捕获不同的异常
3,一个catch也可以同时捕获多种异常,需要用|分隔
4, 如果异常之间存在父子关系,子异常要放在前面,否则子异常会报错
5,finally代码块永远会执行,就算try里有return,除非前面执行了System.exit();//直接结束应用
thorws + 异常类型写在方法的声明处
//指明此方法运行时可能会抛出的异常,没有真正处理掉异常,只是把异常传递给了上级方法
// 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
修饰符 返回类型 方法名(参数列表) throws 异常1,异常2{
方法体;//向上抛出异常
//当方法中的代码执行出现异常时,异常后的代码将不再执行,异常将会抛给当前方法的调用者,由它的上级来处理
}
手动抛出异常throw
修饰符 class 异常类名 extends Exception/RunTimeException{
//自定义异常类,继承Exception或者RunTimeException
}
异常类名 异常对象 = new 异常类名();
throw 异常对象
一个问题:throws和throw的区别
throw表示的是抛出了一个异常类的对象,生成异常对象的过程,声明在方法体内,一定是发生了这个异常的。
throws属于异常处理的一种方式,声明在方法的声明处,是指有可能发生这些异常,但是不一定发生。