Java:异常

异常

异常简介

程序出问题,我们没有做任何处理,最终JVM会做默认处理,在控制台输出异常的名称原因以及出现的位置并且中止程序的运行。
在这里插入图片描述
Error是编译错误和系统错误
RunTimeException:运行时期异常,所以编译的时候是可以通过的

Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和啡受检异常
所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常
编译异常必须处理后才可以通过编译

异常处理

为什么要处理异常?java的虚拟机会在运行程序异常的地方结束掉,但有时候出现异常不应该影响我们后序程序的执行,所以我们需要对异常进行处理。
两种方法处理异常:

1.try…catch…
2. throws

try…catch

格式:
在这里插入图片描述
执行流程:
程序从try里面的代码开始执行(try里面的代码不会被忽略)
如果出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统。当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类(异常类和异常对象是相同的,变量名接受的就是异常对象,接收后就是异常对象名了),找到后进行异常的处理也就是执行catch部分的代码
执行完毕之后,程序还可以继续往下执行

Throwable是所有异常的父类,所以异常都可以调用它的方法
举个栗子:
在这里插入图片描述
这一段程序的执行顺序,先执行try的代码,然后在system那块出现异常,程序自动生成一个异常对象,new ArrayIndexOutBoundsException(),然后系统会拿这个异常对象与match里的异常类进行匹配,匹配上将异常赋给后面的变量名。

在这里插入图片描述
记第三个就行,找个方法返回的异常信息是最全的

public void printStackTrace

throws

虽然我们通过t.y…c.c…可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理
也就是说,有些时候可能出现的异常是我们处理不了的,这个时候该怎么办呢?
针对这种情况,Java 提供了throws的处理方案

在这里插入图片描述
比如这样

但要注意throw起的作用只是抛出异常。也就是当前方法不能处理这个异常(不会在这个方法这里进行异常的报错),抛出这个异常,而调用这个方法的方法将会接收这个异常,而接收调用者的方法还是得用try…catch…进行异常处理,不然无法进行后面程序的执行。

总结:

在这里插入图片描述

自定义异常

可以根据自己的需要,不同环境有不同的提示/报错来书写自定义异常

自定义异常类,必须继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个编译期异常,如果出现了编译期异常就必须处理,要么throws ,要么try catch 继承RuntimeException:那么自定义的异常就是一个运行期异常,无需处理,交给虚拟机处理,中断处理。

自定义异常的步骤

(提醒,可以先往下划,有这一段的完整代码)
1.定义一个继承Exception或者RuntimeException的自定义异常类

public class ScoreException extends Exception{
    public ScoreException(String message){
        super(message);
    }
}

2.在进行数据处理的时候进行异常调用,比如下面这个,在自定义类中的一个对分数进行判断的方法进行了判断异常的调用
在这里插入图片描述

(这段代码的实现过程:给自定义异常传入一个参数,作为异常原因,后面再控制台会输出,原因的话得看这个自定义异常继承的父类,父类中专门有定义一个参数用来存储异常原因)

这段代码抛出的异常是ScoreException类(Exception的子类),后面调用者接收的要么ScoreException类要么Exception类

所有接在在主函数中调用Teacher类checkScore这个方法要用try…catch…接受异常进行异常处理,才能确保程序正常执行
如果checkScore函数抛出异常,系统创建一个ScoreException的对象接受异常,然后和ScoreException匹配,匹配成功由e来接受,在控制台输出异常描述。
在这里插入图片描述

控制台输出:
在这里插入图片描述
完整代码来一个吧:

package temp;

import java.util.Scanner;

public class Main {
    public static class ScoreException extends Exception{
        public ScoreException(String message){
            super(message);
//        传递异常信息
        }
    }
    public static class Teacher {
        public void checkScore(int score)throws ScoreException {
            if(score<0||score>100)
                throw new ScoreException("分数应处于0~100之间");
            else System.out.println("满足分数要求");
        }
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int score=in.nextInt();
        Teacher teacher=new Teacher();
        try {
            teacher.checkScore(score);
        }
        catch (ScoreException e){
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

区分throw和throws

在这里插入图片描述
对比一下
在这里插入图片描述
在这里插入图片描述

posted on 2022-01-21 21:34  不依法度  阅读(9)  评论(0编辑  收藏  举报

导航