Java中已经提供了许多的异常类来处理相关的异常,所有异常的根类:Java.lang.Throwable.
- Throwable有两个子类:Error和Exception
- Error(错误):指的是程序本身无法处理的问题
- Exception(例外):指的是程序本身可以处理的问题
- Exception(异常)的分类:
- 非运行时异常:指的是编译期就会检查的异常。例如:IO流异常,数据库驱动加载异常。
- 运行时异常:指的是运行期间发生的异常。例如:RuntimeException类以及其所有子类都属于运行时异常
- 处理异常的两种方式:
如果自己能够处理则自己处理:通过try_catch来捕获异常。
//非运行时异常:加载 数据库驱动
try {
Class.forName("com.mysql.jdbc.Driver");//可能产生异常的代码
}catch (ClassNotFoundException e) {
//异常产生后执行的代码
System.out.println("数据库驱动加载失败");
//打印异常的详细信息
e.printStackTrace();
}finally {
System.out.println("不管是否产生异常,都会执行的代码");
}
如果自己不能处理则抛出给上级去处理:通过关键字throws可以将异常抛出给上级处理。
private static void test1() throws ClassNotFoundException{
//非运行时异常:加载 数据库驱动
Class.forName("com.mysql.jdbc.Driver");//编译期就会检查,如果不处理则无法通过编译。
}
自定义异常:Java系统已经提过了非常多的异常类,但是有时候还是不满足用户的需求,此时我们可以自定义异常。
- 定义异常类:异常描述+Exception
- 继承异常类:Exception或者RuntimeException
- 重写两个构造器:一个空构造和一个带参数提示的构造器
//自定义异常类
class AgeValueException extends RuntimeException{//运行时异常
//一个空构造
public AgeValueException() {
super();
}
//一个带参数提示的构造器
public AgeValueException(String message) {
super(message);
}
}
//设置年龄:要求年龄只能设置0到100岁
public void setAge(int age) {
//判断是否超出年龄范围
if(age <0 || age>100) {
//年龄超出范围:抛出异常 - 自定义异常
AgeValueException ave = new AgeValueException("超出年龄范围,年龄只能设置在[0,100]之间!");
//抛出该异常对象
throw ave;
}else {
this.age = age;
}
}