编译时异常
必须要手动抛出,否则代码报错,提醒程序员检查本地配置
运行时异常
代码出错,而导致程序出现问题
异常的作用
1,查询bug关键参考信息
2,异常可以作为方法的返回值,用于通知调用者执行情况,相较于直接打印更明显,打印是白字
使用throw new 异常对象;
看报错的技巧,看红色部分即可,at从下往上看
异常处理方式
1,JVM默认处理方式
以红的字打印在控制台,程序停止运行,下面的代码不在执行。
把异常名字,异常原因及异常出现的位置输出在控制台
2,自己处理(异常捕获)
好处:当代码出现异常时,可以让程序继续往下执行。
问题1
问题2
写多个catch时,父类的异常要写在下面,不然报错。
Java的catch
块是按从上到下顺序匹配的,一旦某个catch
块匹配成功,后续的catch
块就会被忽略。如果父类异常(如Exception
)写在前面,它会捕获所有子类异常(如NullPointerException
、IOException
等),导致子类异常的catch
块永远无法执行。
子类在前,父类在后,可以确保更具体的异常优先被处理,通用异常作为兜底。
问题3
就是catch里的异常对象不能接收try抛出的异常(没有父子关系),所以将这个异常交给虚拟机处理。
问题4
IDEA快捷生成包裹代码:先选中再ctrl+alt+t
异常常用方法
异常的子类,自动拥有父类所有非私有(public
、protected
)的方法,也可以使用以下方法。
其中printStackTrace方法用的最多,其底层使用了System.err,这是一个错误输出语句
System.err.println("我错了!!!!");
//只需了解,还有一个细节,在和正常打印语句一起执行时,打印的顺序可能会乱,与多线程有关。
3,抛出异常 throw/throws
运行时异常可以省略不写
什么时候抛出,什么时候捕获??
抛出:告诉调用者出错了,更多写在方法里面
捕获:不让程序停止,更多写在方法调用处
自定义异常
没有异常能完美表达我现在出的异常,我看其他异常咋写的。
创建步骤:
1,自定义异常类。类名要见名知意
2,写继承关系。运行时异常继承运行时异常RuntimeException,编译异常继承Exception
3,写空参构造器
4,写带参构造器