异常是什么?
异常是程序中可能遇见的问题。
异常的最上层父类是谁?异常分为几类?
异常的最上层父类是Exception(我们一般会用Exception以及它的子类来封装程序出现的问题)
异常分为运行时异常和编译时异常
编译时异常:除了RuntimeException本身和它的子类,其他都是编译时异常,直至继承于Exception。编译阶段出现错误提醒
运行时异常:RuntimeException本身和子类。编译阶段没有错误提醒,运行时出现
举个例子:
1.编译时异常:
2.运行时异常
异常的作用
作用一:异常是用来查询bug的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常处理方式
一.JVM默认处理方式
1.把异常的名称、异常原因和异常出现的位置等信息以红色字体打印在控制台
2.程序停止执行,异常下面的代码不会执行
二.自己处理(捕获异常)
遇见异常不会停止,执行catch里的部分,之后还会继续执行catch后的代码
格式:
try{
可能异常的代码;
}catch(异常类名 变量名){
异常处理代码;
}
1.如果try中没有遇见问题,直接执行catch之后的代码,不会执行catch里的代码
2.如果try里有多个问题,写多个catch与之对应,如果我们要捕获的的异常存在父子关系,父类一定要写在下面,可以写在一块
3.如果try中遇到的问题没有被捕获的话,那catch相当于白写了,还要看JVM
4.try遇见了问题,会跳过下面的代码,执行catch
异常里的常见方法:
public String getMessage() 返回此throwable的详细消息字符串
public String toString() 返回此可抛出的简短描述
public void printStackTrace() 把异常的错误信息输出在控制台
注意一下,e.printStackTrace不会停止方法,还会继续执行后边的代码
抛出处理
throws
注意:写在方法定义处,表明声明一个异常,告诉调用者,使用本方法可能会有哪些异常
public void 方法() throws 异常类名1,异常类名2···{
······
}
编译时异常:必须要写(比如上文举例的编译时异常)
运行时异常:可以不写
throw
注意:写在方法内,结束方法;手动抛出异常对象,交给调用者;方法中下面的代码不再执行了
public void 方法(){
throw new NullPointerException();
}
在方法中,出现异常了,方法就没有继续运行下去的必要了,采取抛出处理,让该方法结束运行并告诉调用者出现了问题
自定义异常
①定义异常类
②写继承关系
③空参构造
④带参构造