异常

异常介绍

  • 异常的概念

异常,就是不正常。
程序运行中出不正常情况,就叫做异常。
java中的异常:空指针异常;数组下标越界异常;类型转换异常;……

为什么要学习异常

  1. 程序运行时不可能不出现任何问题的;

即使我们的程序本身没问题,但是程序一般是要给用户使用的,我们不能控制用户不输入错误数据;而且有的程序会需要使用第三方的数据,而这第三方的数据也不能保证没有问题;

一个好的程序,不是不会出现问题,而是出现问题后,有预备方案可以解决;

学习异常技术,可以在编写代码时,就为程序中可能出现问题的地方提前书写处理代码,当程序真的出现问题时,就能够执行相应的操作,提高程序的健壮性;

  1. 程序中真的出现问题时,需要提供一个对用户友好的提示信息,同时应该有一种机制可以把错误发生的位置、原因等信息记录显示出来,方便开发者排查错误;

学习异常技术,就可以在编写代码时就提前把这些操作在可能出现问题的地方写好。

https://www.zhihu.com/video/1067532705738231808


异常使用演示

演示使用异常技术提供对用户友好的错误提示

需求:编写一个方法,根据传入的下标,从数组{ "快学大数据-JavaEE","快学大数据-UI/UE","快学大数据-Python" }中取出数据;

原来的代码:

原来的异常提示信息:

使用自定义的异常信息来处理程序:

新的提示信息:

https://www.zhihu.com/video/1067534100948275200


异常信息显示过程

https://www.zhihu.com/video/1067534355660009472


异常技术的继承体系

在抽取和封装问题的过程中,形成了异常的体系结构:

Throwable:它是异常的顶层父类(它的父类是Object)。

Error:它是错误的问题顶层父类。

Exception:它是一些常见的异常问题的顶层父类。

我们讲解的异常主要针对的Exception这类问题。而针对Error问题,这时就必须对程序的架构、设计、代码进行重新的调整。

https://www.zhihu.com/video/1067534831025647616


自定义异常

  • 自定义异常的原因

JDK自己提供的异常很全面,根据开发中大多数问题,都有相应的异常类,但是我们使用起来是比较麻烦的;

异常类太长,记忆和书写都不方便;

异常类很多,开发者不可能都记下来,使用时就很不方便;

所以开发中,我们一般会自己定义异常类,来描述程序中可能出现的问题;

【重点】自定义异常的步骤

自定义异常类的步骤:

  1. 自定义一个类,继承Exception或者RuntimeException类,使其成为一个异常类;
  2. 在这个类中提供一个有参构造函数,接受一个字符串类型的参数,用来接受抛出异常时的错误信息;
  3. 在构造函数中通过super关键字调用父类有参构造函数,将接受到的参数传递给父类;
  • 自定义异常演示

需求:创建一个描述人的信息的类,需要对年龄的合法性进行判断;

自定义的异常类:

自定义异常类的使用方式:

https://www.zhihu.com/video/1067535251496169472


异常的分类

编译期异常(受检查异常):

指的是Exception及其子类(不包括RuntimeException和它的子类)表示的异常;

特点是:如果在程序中使用throw关键字显示的抛出这类异常,编译时编译器会检查有没有书写处理代码,如果没有就会报错;

(也就是说,程序中如果抛出这类异常,必须处理)

运行期异常(不受检查异常):

指的是RuntimeException和它的子类表示的异常;

特点是:如果程序中使用throw关键字显示的抛出这类异常,不管书写处理代码没有,编译时编译器都不管;

编译期异常和运行期异常,指的是编译的时候,是否检查书写了处理代码;

不管是什么异常,真正发生,都是在程序运行的时候;

如果开发中,有的问题必须要被处理,就应该声明为编译期异常;否则可以声明为运行期异常;

https://www.zhihu.com/video/1067535590941257728


异常的处理

准备的编译期异常类:
public class MyException1 extends Exception {public MyException1(String msg) {super(msg);}
}
public class MyException2 extends Exception {public MyException2(String msg) {super(msg);}
}

https://www.zhihu.com/video/1067535636982054912


异常的声明

如果程序不能自己解决出现的问题,就可以使用throws关键字,在函数的参数列表后面、函数体大括号前面将异常的类型声明出去,目的时告诉调用者,这个函数执行时有可能会出现什么问题;这种处理方法就叫做异常的声明;

一般函数中,如果是因为参数不合法而出现的问题,应该使用声明来处理异常,告诉调用者这个函数可能出现什么问题;

https://www.zhihu.com/video/1067535697573056512


异常的捕获

如果程序中出现的问题可以自己解决,就可以使用try-catch代码块,将可能出错的代码包起来,然后书写处理代码;这种处理方式叫做异常的捕获;

异常的捕获格式:

try{这里应该书写的是可能出现问题的代码;}catch(这里应该书写的是一个变量,用来保存异常对象){这里应该书写的是问题被捕获后的处理代码;}

注意:捕获的多个异常,如果没有继承关系,他们的先后位置没有约束;

如果有继承关系,子异常应该在上面,父异常应该在下面;

注意:上面的这种写法,要求被捕获的各种异常类,不能有继承关系;

https://www.zhihu.com/video/1067535842339434496


异常的其他细节

异常在继承中的注意事项

子类重写父类函数,不能比父类函数声明更多编译期异常;

  • 父类方法没有声明异常,子类重写的方法不能声明编译时异常
  • 父类函数声明了编译期异常,子类可以不声明;
  • 父类方法声明了一个编译异常,子类重写的方法只能声明这个异常或它的子异常
  • 父类方法声明了多个编译异常,子类重写的方法只能声明这些异常的子集或子集的子类

https://www.zhihu.com/video/1067536054478827520

最新文章

  1. 个人推广网站不花钱的一些方法
  2. css样式之background详解(格子效果)
  3. UVa1339 - Ancient Cipher
  4. mysql 语法积累
  5. 有关算法方面的经典书籍推荐
  6. MySQL之单表查询、多表查询(一)
  7. 【人脸对齐-Landmarks】300W 数据集
  8. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
  9. ListView自适应实现表格
  10. 杭电1229 还是A+B
  11. php 保存json格式数组 json_encode /u 不转义
  12. 参数估计:矩估计和最大似然估计
  13. 用计算机弹让我做你的眼睛,童珺 - 让我做你的眼睛 (改编版)-酷歌词...
  14. 怎么为PE添加输入法
  15. python3 经典练习题:输入三个数,输出三个数中的最大数
  16. web前端面试学习指南
  17. MySQL数据库在Windows系统上安装和基本使用
  18. 苹果手机测距离_重量仅6g,智能距离检测,安卓苹果平板手机都能用,声光多级提醒...
  19. 淘宝自动查券找券返利机器人实现方法分享
  20. 数据库(oracle)服务器的cpu大于80%

热门文章

  1. mongo之$group+$addToSet
  2. 基于windows fiber的协程(coroutine)实现
  3. ModelSerializer序列化(Apiview)
  4. learning-oracle-how2j
  5. 记一次复杂的正则匹配——匹配但不包含
  6. 用VC++封装自己的DLL动态链接库
  7. Rabin-Karp算法详解和实现(python)
  8. python-绘制双轴柱状图
  9. python 输出函数表达式——LaTeX数学公式
  10. Windows编程系列(前言)