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
对比一下