七、异常
异常的概述
异常就是有异于常态,和正常情况不一样,有错误出现。在java中,阻止当前方法或作用域的情况,称之为异常。
异常的体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYV0SvTa-1610097951596)(异常的体系.jpg)]
Error:严重异常,处理不了,如:硬件问题
Exception:称为异常类,表示程序本身可以处理的问题
- RuntimeException:在编译期是不检查的,出现问题后需要我们回来修改代码、
- 非RuntimeException:编译期就必须处理的,否则不能通过编译
JVM的默认处理方案
如果程序出现了问题,我们没有处理,那么jvn会做默认处理
- 把异常名称,异常原因和异常出现的位置等信息输出在控制台
- 程序停止执行
自主处理异常
因为在java程序中默认的异常处理是将整个程序停止运行,但在实际开发中出现我们希望的是出现异常后不影响或许执行,这就要自己来处理异常了。
在java中异常的处理方案有两种:
- try…catch…
- throws
try…catch…
格式:
try{
可能会出现异常的代码
} catch(异常类名 变量名){
异常的处理代码
}
执行流程:
程序从try开始执行,出现异常会自动生成异常类对象,该异常对象将被提交给java运行时系统。
当java运行时系统接收到异常后,会去catch找匹配的异常类,找到后进行异常的处理执行,程序还可以继续向下执行
实现代码:
public class Demo01 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
int[] i = {1,2,3};
try {
System.out.println(i[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("超出索引范围");
}
}
}
throws
虽然我们通过try…catch…可以对异常进行处理,但并不是所有的异常都可以进行处理
针对这种情况,java提供了throws的处理方案
格式:
方法名() throws 异常类
执行流程:
暂时不用管这个异常,谁调用谁处理
自定义异常
尽管java官方给出了很多异常,但在实际开发中这些异常是远远不够的,如分数必须在0-100之间
这时候的就需要我们来自定义异常处理
格式:
public class 类名 extends Exception {
无参构造
带参构造
}
具体实现:
//自定义异常类
public class GradeException extends Exception {
public GradeException() {
}
public GradeException(String message) {
super(message);
}
}
//分数类
public class Grade {
public void gread(int i) throws GradeException {
if (i < 0 || i > 100){
throw new GradeException();//不会输出错误信息
//throw new GradeException("输入有误");//会输出错误信息
} else {
System.out.println("输入正常");
}
}
}
//测试类
public class GradeTest {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("输入分数:");
int i = s.nextInt();
Grade g = new Grade();
try {
g.gread(i);
} catch (GradeException e) {
e.printStackTrace();
//System.out.println("输入有误");
}
}
}