简述
1、异常是什么
- 异常是代码在编译或者执行过程中 可能 出现的错误
2、异常分类
- 编译时异常、运行时异常
- 编译时异常,没有继承RuntimeException的异常,编译阶段就会报错
- 运行时异常,继承自RuntimeException的异常或其子类,编译阶段不报错,运行可能报错
3、学习异常的目的
- 避免异常的出现,同时处理可能出现的异常,让代码更稳健
运行时异常
- 直接继承自RuntimeException或者子类,编译阶段不会报错,运行时可能出现的错误
运行时异常示例
- 数组索引越界异常 ArrayIndexOutOfBoundsException
- 空指针异常:NullPointerException ,直接输出没问题,但是调用空指针的变量的功能就会报错
- 数字操作异常:ArithmeticException
- 类型转换异常:ClassCast Exception
- 数字转换异常: Number FormatException
运行时异常一般为程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误
编译时异常
- 编译阶段就报错,必须处理,否则代码不通过
示例,只能抛出异常
编译时异常作用
- 是担心程序员技术不行,在编译阶段就报一个错,目的在于提醒不要出错
异常处理机制
默认异常处理机制
- 默认会在出现异常的代码那里自动创建一个异常对象:比如ClassCastException
- 异常会从方法中出现的点这里抛出给调用者,调用者最终会抛给JVM虚拟机
- 虚拟机 接收到异常对象后,先在控制台直接输出异常栈信息数据。
- 直接从当前执行的异常点干掉当前程序
- 后续代码没有机会执行了,因为程序已经死亡
异常处理
编译时异常是编译阶段就报错的,所以必须处理,否则代码无法通过
处理方式
- 出现异常直接抛出给调用者,调用者也继续抛出去
- 出现异常自己捕获,不麻烦别人
- 前两者结合,出现异常直接抛出去给调用者,调用者捕获处理
1、throws
方法上抛出异常,调用方法上也抛出异常
2、try….catch…
方法内部处理异常,不抛出
- 监视捕获异常,用在方法内部,可以将方法中出现的异常直接捕获处理
- 这种方式可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行
输出基本都是e.printStackTrace(),打印完全的异常信息
3、前两者结合
方法上抛出异常。调用方法用try..catch处理
异常处理总结
- 在开发者按照规范来说第三种方式是最好的,底层的异常抛出给最外层,最外层集中处理捕获异常
- 实际应用中,只要代码能够编译通过,并且功能完成,那么每一种异常处理方式似乎都是可以的。
自定义异常
自定义异常的必要?
- java 无法为所有问题提供异常类
- 如果企业想要通过异常的方式处理自己的某个业务问题,就需要自定义异常类了。
自定义异常的好处
- 可以使用异常的机制管理业务问题,如提醒程序员注意
- 同时一旦出现bug,可以用异常的形式清晰的指出出错的地方
自定义异常分类
1、自定义编译时异常
- 定义一个类继承Exception
- 鼠标右键,选择 construction 构造方法,输出前两个就行
- 使用时在出现异常的地方用throw new 自定义对象的形式抛出
作用,编译时异常编译阶段就报错,提醒更强烈,一定要处理
2、自定义运行时异常
- 定义一个类继承RuntimeException
- 鼠标右键,选择construction构造方法,输出前两个就行
- 使用时在出现异常的地方用throw new 自定义对象的形式抛出
作用,提醒不强烈,编译阶段不报错,运行时才可能出错。
注意:二者用法区别仅在于继承类不同
方式
首先创建一个类继承Exception或者是RuntimeException(推荐),然后右键生成两个构造方法
public class ageException extends Exception {
//右键, constructor 生成前两个方法即可
public ageException() {
}
public ageException(String message) {
super(message);
}
}
这样就可以直接调用了.遇到异常抛出即可
public class test {
public static void main(String[] args) throws ageException {
checkAge(-10);
}
public static void checkAge(int age) throws ageException {
if (age <0 || age >200){
//抛出异常
throw new ageException(age+": 年龄不合法");
}else {
System.out.println("年龄合法");
}
}
}
结果