一 异常处理
Throwable(异常处理的父类)
1 Error ———————- 系统奔溃 数据库崩溃(与所写代码没关系)
2 Exception ——————–异常(与所写代码有关系)
RuntimeException——————运行时异常
出现异常 系统如何解决 (谁来解决)
main 解决的方式
1 main函数自己解决
2 把问题抛给上级去解决(谁调用了main 函数 谁去解决)
交给jvm虚拟机去解决
jvm虚拟机如何解决?给你报错
打印错误信息 错误发生在什么类的什么位置
我们下面来看看3个常见异常
1 角标越界异常
int[] array=new int[] {1,2,3,4,5};
System.out.println(array[5]);
2算术异常
int i= 0;
int z= 1;
int y = z/i;
System.out.println(y);
3空指针异常
int[] array=new int[] {1,2,3,4,5};
array= null;
System.out.println(array[0]);
二 解决异常方式
try —- catch —– finally —–
try 指测试这个异常
catch 指捕获这个异常
finall 指异常结束后做的事
捕获异常的流程
1 发生异常
2 根据发生的异常产生对应的异常对象
3 这个异常对象会返回给调用者
4 如果调用者处理了这个异常(添加try catch)
异常对象会跟catch进行匹配 匹配上执行catcch语句
程序会继续执行
5 如果调用者没有处理这个异常 默认交给jvm虚拟机处理
根据异常 打印错误信息
三 finally
finally(遗言)
记住 不管你异常有没有发生 有没有匹配到 都会执行
finally有什么作用?
可以关闭系统资源 避免资源的浪费
(例如 关闭输入流 和 关闭数据库)
思考
final finally finalize 有什么区别
雷锋和雷锋塔的区别 没什么联系 一点关系都没有
final 修饰属性 修饰方法
finally 中语句 一定会执行 (异常处理的语句)
finalize 基类Object类方法
所有java中对象都有这个方法
该方法中垃圾回收的时候 被系统自动调用
当一块内存空间 无人引用 这块内存就是垃圾
try {
System.out.println(10/1);
return;
}
catch(ArithmeticException e) {
System.out.println("除0 了");
}
finally {
System.out.println("你看我执行了么");
}
System.out.println("我下面的语句");
}
我们下面给个需求
1 创建一个人类 有name 和 age
2 要求 人类年龄赋值时 要在 0 -120 之间
class People{
private String name;
private int age;
/**
*
*/
public People() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param name
* @param age
*/
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
//如果这个方法 要抛出异常 给调用者
//那么必须在方法的声明上 标示这个方法为异常方法
//throws Exception 标示是抛出什么异常
/**
* throws 和 throw 区别
* throws 抛出这个方法 可以抛出一个异常
* (在方法的申明出现)
* throw 抛出一个异常对象(在方法中出现)
*
* @param age
* @throws Exception
*/
public void setAge(int age ) throws Exception {
//加个年龄时间
if (age>0 && age<120) {
this.age = age;
}
else {
//System.out.println("外星人");
//抛出一个异常 告诉他 你赋值的年龄不对
//throw 关键词 抛出一个异常对象
//创建一个异常对象 把这个异常对象抛出去
//抛给谁 谁用赋值抛给书
//Exception exception = new Exception("年龄非法");
//使用匿名对象抛出
//throw new Exception();
//使用自定义类处理异常
AgeOutOfBoundException exception = new AgeOutOfBoundException("年龄非法");
throw exception;
}
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + "]";
}
}
//创建一个自定义的异常类(继承Exception)
// 在创建异常类时 需要直观让人知道这是什么异常
//所以类名 要 见名知意
class AgeOutOfBoundException extends Exception{
/**
* 序列化时 需要的id
*/
private static final long serialVersionUID = 1L;
//重写构造方法
public AgeOutOfBoundException() {
super();
// TODO Auto-generated constructor stub
}
public AgeOutOfBoundException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}