Exception:异常 需要通过throws和try...catch去处理
a.运行时期异常:RuntimeException以及它的子类都属于运行时期异常
表现形式为:代码编写的时候没有问题,但是一运行就报错
b.编译时期异常:Exception以及子类(除了RuntimeException之外)
表现形式为:代码编写的时候没有语法错误,但是调用了某个方法,而这个方法底层抛出了一 个编译时期异常,导致我们的代码一用就爆红了
异常处理方式一_throws
在方法的参数后面-> throws 异常
public class Demo04Exception {
public static void main(String[] args)throws FileNotFoundException {
String s = "abc.txt1";
insert(s);
}
private static void insert(String s)throws FileNotFoundException{
if (!s.endsWith("txt")){
//故意造异常
throw new FileNotFoundException("文件找不到了");
}
System.out.println("添加功能");
}
}
处理异常,并不是将有异常的代码变成没有异常了,而是将编译时期异常出现的红线给消除掉
异常处理方式一_throws多个异常
throws 异常1,异常2...
如果有多个异常,并且多个异常之间有子父类继承关系,那么我们可以直接抛父类异常
无脑往上throws,最终还是给jvm了,jvm会终止程序的,所以无脑往上throws,会因为一个功能出现异常,导致其他功能全使用不了了,不负责任
异常处理方式二_try...catch
try{
可能出现异常的代码
}catch(异常 对象名){
处理异常的代码 -> 打印异常信息 -> 将来都是将异常信息放到日志文件中
}
如果try中有异常,马上catch,我们要catch到这个异常;如果没有catch到这个异常,相当于没有写try...catch编译时期异常的红线还会飘着
public class Demo07Exception {
public static void main(String[] args) {
String s = "abc.txt1";
try {
insert(s);
}catch (FileNotFoundException ex){
ex.printStackTrace();//将详细的异常信息打印到控制台上
}
}
private static void insert(String s) throws FileNotFoundException {
if (!s.endsWith("txt")) {
//故意造异常
throw new FileNotFoundException("文件找不到了");
}
System.out.println("添加功能");
}
}
异常处理方式二_多个catch
如果catch的多个异常之间有子父类继承关系,我们可以直接catch父类异常
public static void main(String[] args) {
String s = "abc.txt1";
try {
//int[] arr = null;
//System.out.println(arr.length);//NullPointerException
insert(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
delete();
update();
select();
}
private static void select() {
System.out.println("查询功能");
}
private static void update() {
System.out.println("修改功能");
}
private static void delete() {
System.out.println("删除功能");
}
private static void insert(String s) throws FileNotFoundException {
if (!s.endsWith("txt")){
//故意造异常
throw new FileNotFoundException("文件找不到了");
}
System.out.println("添加功能");
}
使用try...catch进行异常的处理,即使发生异常,也不影响后续代码的执行,(而不是像throws那样直接终止程序),保证了系统的运行.throws方式处理的异常在控制台只会显示一个,因为出一个异常上抛到JVM程序就结束了.
1.如果处理异常之后,还想让后续的代码正常执行,我们使用try...catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try...catch做一个统一的异常处理
抛异常时注意的事项
1.父类中的方法抛异常了,子类重写之后,要不要抛? 可抛可不抛
2.父类中的方法没有抛异常,子类重写之后,要不要抛? 不要抛
finally关键字
try{
可能出现异常的代码
}catch(异常 对象名){
处理异常的代码 -> 打印异常信息 -> 将来都是将异常信息放到日志文件中
}finally{
不管你有没有catch到异常,都一定会执行的代码块
}
finally的使用场景:
针对于GC清理不掉的对象,我们只能自己手动清理,那么这些对象只要是new出来了后续是否使用了,或者使用的过程中是否有异常了,不管异常是否捕获到了,最后我们都应该手动清理
所以手动清理对象的代码应该放到finally里面--> finally的使用场景
打印异常信息的三个方法
String toString():异常类型以及异常信息
Stirng getMessage():异常信息
void printStackTrace() :打印异常信息是最全的