blog 2019.3.15 Day16 异常

异常的处理

异常的概念

程序运行期间出现的错误,程序开始执行,在执行期内出现的问题。比如indexoutof(溢出)。出现了异常过后,我们要关注异常的类型、异常出现的行号
在Java中,java的异常是java提供的用于处理程序错误的一种机制(方案)。

错误指的是在程序运行过程中发生的一系列不可避免的异常事件:比如:下标越界,空指针,除数为0
异常处理机制:一旦异常发生过后,使用异常处理机制让程序不会直接中断或者影响虚拟机运行。
任何一个高级语言都要有异常处理机制。


异常的分类

1、Error:称为错误(不是异常),JAVA虚拟机生成并抛出,虚拟机错误、动态链接失败之类的等等。程序控制不了,用户也无法控制。更多指的是 jvm的运行环境问题。
2、Exception:异常。用户犯的错误或者程序无法预见的一些问题(下标越界、用于输入了一个0,然后10除以0等等)。Exception是所有异常的父类,它提供了很多个子类,每一种子类都对应到一种异常情况。一旦出现Exception异常,需要开发者自己去处理(捕获此异常)。
3、Runtime Exception:程序在运行过程中可能发生的,是可以被程序员避免的异常。如果你不处理,抛出异常过后就提示 开发者 要关注这个异常。

常见的异常
运行时异常 RuntimeException:一旦出了异常,流程全部中断。

   {
    类转换异常 ClassCastException
    空指针异常:NullPointerException
   未知类型异常 UnknownTypeException
    越界异常IndexOutOfBoundException
    以上均属于运行时异常
    }

运行时异常,开发过程中不予理会,等出错误的时候再回过头来抛异常 。


异常的执行流程

在方法中执行过程,方法押入到方法栈中,在某一个方法中出现 了运行时异常,没有处理这种异常,后边方法的内容将无法执行,异常抛给了虚拟机。中断了虚拟机继续运行。后面的方法就没法执行了。

方法栈:方法在调用的过程中,先执行的方法后退出。

在这里插入图片描述
运行流程:
1、main在栈的最底部,method2在栈的最顶部、method2抛出一个异常,method2从栈中取出来。
2、将异常抛给method1,method1并没有处理这个异常,将异常抛给main方法,此刻method1也被移除出栈。
3、main方法接到了method1抛出来的异常,main也没有处理这个异常,当前这个异常就会抛给虚拟机,虚拟机只要接收到异常了,虚拟机就会创建一个异常对象Exception。虚拟机会识别异常分类创建一个异常对象,接下来就会直接将异常信息打印到控制台,结束程序。


异常的结构体系

Throwable : 所有异常的根基类,也可以抛出。
Error:表示错误,程序不处理,也处理不了,开发过程中程序无法控制和处理。
Exception:表示异常,开发过程中可以去进行处理。
RuntimeException:
SQLException:

Exception 检查异常和非检查异常。
检查异常:编译器要求你必须要处理的异常,不处理程序无法运行。当你代码没有运行的时候,编译器就报错,检查出来问题。
非检查异常:指的是编译器不强制要求处理的异常。(黄色感叹号)。虽然有可能在运行中出问题,但是他不要求你处理。主要指RuntimeException以及子类的异常。


异常的基本用法

捕获异常

语法1:try catch方法。
在这里插入图片描述

如果不清楚会出什么异常,就直接输入父类就不会错。
在这里插入图片描述

可以通过错误名.printStackTrace(比如上面的就是e.printStackTrace)打印出 出的问题

在这里插入图片描述

语法2:多重catch

  try{
    }catch(){
    
    }catch(){
    
    }

用于处理多个异常选项。

每个花括号内的变量都是局部的 可以每个catch里面的变量都是e

语法3:finally

try{

}catch(){

}catch(){

}finally{
处理资源的关闭、日志的记录等功能
}

1.finally为异常提供了一个统一的出口,使得当前程序在跳转到另外程序的流程之前,能够对程序进行统一的管理。
2.无论try模块中的内容是否执行,finally代码都得执行一次。
3.通常我们在finally里面要执行的内容是资源的关闭,或者日志的一些记录等。

语法4:try finally

try{

}finally{

}

申明并抛出异常

在本方法中、如果出现了异常,本方法可以不进行处理,抛给调用者来处理。
将异常一层一层的往外抛、在到达虚拟机之前处理好整个程序运行流程也不受影响。

throw:将异常进行抛出(一个动作),不做任何处理,throw后面的内容就不在执行了。
在这里插入图片描述
thorws:声明将要抛出何种类型的异常(声明),抛出去之后,别的方法在调用这个有异常的方法时候就要选择解决问题 或者 继续抛出···最终的异常会交给main方法(虚拟机)来处理。可以同时抛出多个异常。

在这里插入图片描述在这里插入图片描述


重写方法的时候,子类和父类的异常问题

1、父类方法没有抛出异常,而子类重写的方法抛出了异常,这是不允许的,编译都通过不了
2、父类抛出了异常,子类重写方法抛出和父类同样的异常,这是没问题的。
3、父类抛出了异常,子类在重写方法的时候不抛异常,编译器可以编译通过(但是一般不建议使用)。因为重写后,会优先调用子类的方法,若遇到异常,子类会直接抛给虚拟机 这时候就出问题了。
4、父类抛出一个Exception异常,子类可以抛出比exception小的异常,子类的异常不能比父类大。
5、父类抛出异常小于子类的异常,是不行的 编译报错
6、父类抛出一个Exception。子类抛出多个子异常,编译通过。

自定义异常

输入的年龄大于100岁,性别选择中性。。。。

好处:在团队开发的过程中,都是分模块,分功能来进行开发的,在项目中统一制定自己的异常,对外统一显示内容。

1、在用户发请求进行数据验证的时候,如果数据验证失败,自己抛出自定义异常。
2、在开发过程中,遇到某些逻辑上面的问题,比如判断性别出现中性这种情况。java没有提供性别中性异常,我们要自定义
3、系统提供的异常,如果直接给用户,用户体验不是特别好。(因为系统提供的异常会包括异常的信息、代码)。我们希望代码中能抛出去的异常是处理过的异常,提高用户体验。


1、不管自定义异常还是系统提供的异常,都必须是Throwable的子类
2、写一个检查性的异常、需要写一个类去继承exception
3、写一个运行时异常(非检查性异常),需要写一个类去继承RuntimeException

猜你喜欢

转载自blog.csdn.net/qq_39263750/article/details/88571043