1、异常概念
在Java当中,一旦当程序产生了异常之后,JVM默认的处理机制是这样的:在产生异常的代码处自动创建一个该异常的对象,随后将异常对象抛出,随后JVM内存直接中止运行了。
Java异常体系主要就是学习有哪些异常,包括出现一些异常之后我如何对异常进行处理,从而使得程序的运行的损失降低的最低点。
2、Java异常体系—Throwable的子类
Java异常整体分为两类:
Error类型的异常:一般是因为硬件设备的问题导致的一些异常,这种异常就算我们编写了针对性的代码也解决不掉,因此这种异常干脆不做任何的处理。
StackOverflowError和OOM
Exception类型的异常:这种异常一般是因为代码自带的或者是程序员编写代码的时候逻辑出现问题导致的错误都成为exception异常。Exception类型的异常又分为两类:
1、编译时异常-受检异常:在我们使用javac命令编译代码时就会出现的异常称之为编译时异常,这种异常需要开发人员必须手动解决,不解决代码永远无法编译或者运行。
2、运行时异常-非受检异常:运行时异常就是我们在编译代码的时候不会出现任何的问题,可以顺利的编译称为class字节码文件,但是当我们运行的时候,因为无法分别分配或者是其他原因导致的异常称之为运行时异常,异常一般也是不解决的。运行时异常一般是不受控制的,我们可能根本不知道哪一行代码会出现运行时异常。
3、异常的解决方案
(1)抛出:throws—只有方法的抛出
当我们Java程序在运行过程中,如果某一行产生异常之后,JVM会在异常行的位置新建一个该异常的对象,随后异常行之后的代码均停止执行,随后异常对象会被方法抛出,抛出给调用者,然后调用者进行处理,调用者也可以选择抛出处理,如果所有的调用者都是抛出处理,main主方法也是抛出处理,那么程序就直接终止了。
抛出的语法:
访问控制修饰符 static fianl 返回值类型 方法名(xxx) throws 异常类或者是异常类的父类{}
(2)捕获:try catch finally—特殊的代码块处理机制
在异常的两种处理机制中,抛出是一种极不负责任的解决方式,真正可以解决异常问题是try catch finally体系。
使用方式:
try{
异常代码;
如果try块的某一行代码执行出了问题,那么try块剩余的代码均不执行了,随后进行catch匹配,看看异常使用哪个catch解决,最后都要执行一下finally方法。
}catch(异常类 异常对象名){
异常的解决方案
}catch(xxxxx){
}finally{
}
catch块可以有无数个,但是在些catch块的时候,必须按照异常的从小到大的顺序依次捕获。
【注意:两种异常解决方案的使用问题】
结合使用的,一般由最底层的方法抛出异常,然后由调用者进行异常的捕获操作。
特殊的情况,方法重写的情况,如果父类方法没有抛出异常,子类方法产生了编译时异常,那么子类方法只能进行捕获操作,无法进行抛出操作,如果父类抛出了异常,子类不能抛出比父类更大的异常。
4、Java异常的产生的过程问题
当Java代码在运行过程中,如果某一行突然出现了错误bug,一般是由JVM内存在异常产生行的位置创建一个该异常的异常类对象,随后将异常类对象抛出,抛出之后查看异常处是否对该异常有解决方案,如果有的话,按照异常的解决方案进行解决,如果没有解决,那么直接原地报错。
除了由JVM内存帮助我们自动产生异常对象,我们也可以基于这个思想在代码中,合理的利用异常机制自己产生异常的报错,来进行相关功能的开发。
手动抛出方式为:throw new xxxExpection(“message”);