异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。简单来说就是程序在运行时的时候,发生的不正常事件,就是所谓的异常。

异常,:在 Java 中都是以类, 进行体现的。

异常体系:
Throwable:可抛出异常

Error:系统级别问题,JVM退出等,代码无法控制。

Exception:java.lang包下,称为异常类,他表示程序本身可以处理的问题。

RuntimeException:运行时异常,在编译阶段是不会报错的。(例如:空指针异常、数组索引越界异常)。

非RuntimeException:编译时异常,编译阶段报错提醒,必须处理,不然不会通过编译(日期格式化异常)。

java 启动报异常结束程序 java异常报错_父类

 

java 启动报异常结束程序 java异常报错_抛出异常_02

 

 

 

异常的分类 :
编译时异常 ( 受检异常 ): 编译期间 ,代码格式, 语法全部没有错误, 但就是出现了红色波浪线。这是因为代码有可能会错误,

解决方法:抛出异常或捕获异常。

 

 

运行时异常:编译过了, 运行错了。重点 : 在Exception下, RuntimeException 和其子类, 都是运行时异常, 反之, 都是编译时异常。

 

java 启动报异常结束程序 java异常报错_父类_03

 

 

默认处理异常的方式(报错) :
1. 虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。

2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。

3. 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。

4. 直接从当前执行的异常点干掉当前程序。

5. 后续代码没有机会执行了,因为程序已经死亡。

 

异常处理方法:
try...catch :
介绍 :

try...catch 的方式就是捕获异常。

捕获异常:Java中对异常有针对性的语句进行捕获

格式:

try{
        可能会出现错误的代码.......
}catch(要捕获的异常类   变量名){                    //异常类可自定义(必须自己先写类)
         捕获到之后,编写异常的处理方式             //也可以是异常对象方法   
}

try...catch...finally:
finally:常规情况下 finally 代码块中的代码, 是一定要执行的 !!!

try...catch ....catch.....catch....
1. 可以使用多个catch捕获异常, 但是父类的异常要放在最后

2. 多个异常直接, 也可以使用 | 进行隔开


java 启动报异常结束程序 java异常报错_自定义_04

 

 

 

抛出异常Thorw

         有些异常, 我们自己是不能处理的,  应该将问题暴露给使用者,这时候就需要将问题抛出。

public void setAge(int age) throws Exception {
        if(age>=1&&age<=120){
            this.age = age;
        }else {
             //不满足上面情况就抛出异常
            throw new Exception("请输入1-120之间的整数年龄");
        }
    }

 

1.在类名后他声明异常类(thiows 异常类)

2.在代码中抛出异常(throw new 异常类)

 

重点理解 : throw 和 throws 的区别 :
throws : 声明异常的, 告知方法的调用者, 我这个方法里有异常,你调用的时候, 需要准备好应对方案。

throw : 干力气活的, 抛出异常对象

细节 : 如果抛出的是 RunTimeException 或者其子类, 就不需要 throws 声明

注意事项:
1. 子类不能抛出父类没有的, 或者比父类大的异常

2. 父类方法没抛异常, 子类重写父类方法, 如果有异常, 只能 try

自定义编译时异常(作用”:编译时异常是编译时提示报错):
定义一个异常类来继承Exception

 

自定义异常 :
自定义编译时异常(作用”:编译时异常是编译时提示报错):
定义一个异常类来继承Exception

重新构造器

在出现异常的地方用throw new 自定义对象 抛出

自定义运行时异常(作用:编译时不提醒不报错,在运行时才可能报错):
定义一个异常类来继承RuntionException

重新构造器

在出现异常的地方用throw new 自定义对象 抛出