1、throwable
Throwable是java.lang包中一个专门用来处理异常的类。它有两个子类, 即Error 和Exception,它们分别用来处理两组异常。
Error用来处理程序运行环境方面的异常,比如,虚拟机错误、装载错误和连接错误, 这类异常主要是和硬件有关的,而不是由程序本身抛出的。
Exception是Throwable的一个主要子类。
Exception下面还有子类,其中一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括 隐式异常。比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为 运行时异RumtimeException,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。
Exception子类下面的另一部分子类对应于Java程序中的 非运行时异常的处理,这些异常也称为显式异常非 RumtimeException。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。
2、异常概述
异常:就是程序出现了不正常的情况。
异常或者错误,都是以他们所在体系的父类作为后缀。
XxxException 异常
XxxError 错误
3、异常体系
![](https://i-blog.csdnimg.cn/blog_migrate/b9b98187fc08a1879c5c55a073b7b4c8.png)
4、Java虚拟机默认处理异常方式
把异常的类名,位置等信息显示在控制台,例如:
![](https://i-blog.csdnimg.cn/blog_migrate/5cee92cea29e303ef5abbac5e2d521d8.png)
5、异常处理的方式
5.1捕获异常
有以下几种方式:
try{}...catch(异常类名 变量名){}
try{}...catch(异常类名 变量名){}...catch(异常类名 变量名){}
try{}...catch(异常类名 变量名){}...catch(异常类名 变量名){}...finally{}
try{}...finally{}
JDK1.7针对多个catch进行了优化:
try{}…catch(异常1 | 异常2 | 异常3….变量名){}…finally{}
需要注意:
try语句中的代码越少越好。
在多个catch语句中,需要将父异常放在最后面,否则将不会执行具体异常。
异常1、异常2都是平级关系的异常,若含有字符关系将报错。
以后如果运行代码之后出现了异常,若不认识的异常,只需把报的异常类名直接复制到API当中,查看API中对这个类的描述,既可了解到出现问题的原因。
try、catch、finally的概述和作用
try:当觉得某些代码可能出现异常时,就将其放在try的大括号中;检测
catch:catch是捕获异常,当try中的代码出现异常时,且catch语句中含有该异常或该异常的父类的定义,那么该异常将被catch捕获,进行处理。
finally:finally语句中的代码一定会执行,通常用于资源关闭,数据库断开等释放资源的动作。特殊情况:当在执行finally语句前,退出了Java虚拟机,那么finally语句将不会被执行。
5.2声明异常
声明异常:在方法的大括号前用throws 异常类名
当在写方法时,如果觉得会出现异常,且自己没有解决或者想让调用者自己解决时,可以在方法的大括号前用throws异常类名,将可能会发生的异常声明出去。
public static int method(int a, int b) throws Exception {
int c = a / b;
return c;
}
5.3抛出异常
抛出异常:是在方法中用 throw 异常对象
public static int method(int a, int b) {
if (b==0) {
throw new ArithmeticException();
}
int c = a / b;
return c;
}
5.4自定义异常
A、如何自定义一个异常类?
让自定义类继承RuntimeException 或者继承Exception
注意:编译时期异常(非RuntimeException),如果在方法内部用throw抛出了一个异常对象那么在方法声明上必须用throws关键字声明异常,运行时期异常就不需要这样。
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
6、面试题
6.1运行时期异常和编译时期异常的区别?
A:运行时期异常:
是不需要throws或try..catch处理的,只需要修改代码
B:编译时期异常:
需要处理的两种方式throws或try..catch
在开发中异常如果能够捕获最好要捕获处理。
6.2 throw和throws的用法和区别?
A:throw
用法:用在方法内部,后面跟的是异常对象名称,抛出异常
区别:
用throw抛出了编译时期异常,方法上面必须用throws抛出。
用throw抛出了运行时期异常,方法上面可以不用throws抛出。
B:throws
用法:用在方法声明上,后面跟的是异常类名,声明异常
区别:用throws在方法上声明了异常,内部可以没有throw
6.3 Exception和RuntimeException的区别?
A:Exception编译时期异常,必须处理的。
如果在方法上,throws了该类型的异常,将来调用者必须处理。
如果在方法内部,throw了该类型的异常,必须在方法上throws该异常。
B:RuntimeException运行时期异常,是不需要处理的。要改代码的。
如果在方法上,throws了该类型的异常,不需要处理。
如果在方法内部,throw了该类型的异常,方法上可以throws该异常,也可以不throws该异常。
6.4 final,finally,finalize的区别
final:是个关键字。
它修饰的类不能被继承;
它修饰的方法不能不重写;
它修饰的变量就变成了常量。
finally:是一个关键字。
是异常处理的一部分
一般用在捕获异常时,它里面的代码永远会被执行
(特殊情况在执行到finall之前就退出了虚拟机)
finalize() :是Object类中垃圾回收的方法
6.4假如在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
会执行。在return前执行。
原文链接:https://blog.csdn.net/cocochenqiuyue/article/details/78788675