好程序员Java教程系列之异常定义
好程序员Java教程分享Java系列之异常定义
异常定义
异常:就是程序在运行的过程中遇到的种种不正常的情况。
特点:如果一个程序在运行中遇到了一个未经处理的异常,则这个异常会终止程序的运行。
但是如果程序出现的异常被处理了,此时程序不会被终止。所以我们需要知道怎么去处理异常。
其实在Java中,异常也是一个类。
类的体系:
Throwable: 是所有的异常的根类
- Error: 发生在编译器级别的,我们程序无法处理的错误。
Exception: 我们可以去处理的异常。
- RuntimeException:
异常的分类:可以分成两种异常:
运行时异常(Runtime Exception)
- 发生在程序运行的过程中的异常。
- 如果不处理这种异常,程序可以正常编译,但是当执行到异常产生的时候,会终止程序的运行。
- 例如:NullPointerException、IndexOutOfBoundsException、ArithmeticException...
非运行时异常(Non-Runtime Exception)
- 发生在程序编译的过程中的异常。(编译时异常)
- 如果不处理这种异常,程序将无法进行编译。
- 例如:ParseException...
常用结构
需要使用语法:try-catch-finally
语法:
try {
// 这里写可能会产生异常的代码。
// 注意:
// 一旦这里面的代码产生了异常,从异常产生开始往后所有try中的代码都不再执行,直接执行指定的catch
}
catch(需要捕获的异常类型 标识符) {
// 捕获异常,如果try中产生的异常类型和我们要捕获的异常类型匹配,此时会执行这个代码段中的内容
// 如果执行到这里了,相当于这个异常被捕获、处理了,这个异常将不再终止程序的运行。
}
finally {
// 这里的代码始终会执行。
// 无论try中的代码有没有异常产生,这里的代码都会执行。
// 在这里我们一般情况下是做一些资源释放的工作。
}
备注:
- 以上,是完整的try-catch-finally语句。但是实际在用的时候,try后面可以只有catch, 也可只有finally,但是不能什么都没有。
- 一般情况下,catch我们是不会省略不写的。
如果try中的代码可能产生的异常不止一种
如果需要对产生的不同异常进行不同的处理,可以使用多个catch语句
多个catch语句的先后顺序
- 如果多个catch中的异常,没有继承关系,则先后顺序没有影响
- 如果多个catch中的异常,有继承关系,则子类异常在前,父类异常在后
如果需要对某些异常做同样的处理,可以在同一个catch中,用 | 拼接所有要处理的异常。
- 这些用|拼接起来的异常之间,不能有继承关系
- 如果需要对所有的异常做同样的处理,可以在一个catch中捕获一个父类异常。
public static int show(int a, int b) { int c = 0; try { c = a / b; // 能走到这里,说明上面的除没有异常。 return c; } catch (ArithmeticException e) { System.out.println("出现了一个算术异常"); return c; } finally { // 在return之前,执行finally中的代码段 System.out.println("finally中的代码执行了"); c = -10; } }
以上代码段,在try和catch中都有return语句。
finally中的代码始终会执行,但是针对这种情况,他的执行时机:
先执行return语句,此时,将需要返回的值缓存起来。然后再去执行finally语句中的代码,执行结束后,返回刚才缓存的那个值。
finally关键字的应用
throw和throws关键字
throw:
常用在某一个方法中,表示抛出一个异常对象。等在调用这个方法的时候去处理这个异常。
一个异常对象被实例化完成后,不具备任何意义。只有被throw关键字抛出了,才具备异常的功能。
throws:
常用在方法的声明部分,用来描述这个方法可能会抛出什么异常,给调用这个方法的部分看的。
如果在方法中使用throw抛出了一个Runtime Exception:
- throws可以写,也可以不写
- 备注:一般情况下,我们还是会按照实际情况进行描述的。
如果在方法中使用throw抛出了一个Non-Runtime Exception:
- 此时throws必须写
- 可以在方法中不去处理异常,将异常处理提到调用这个方法的时候。
注意:在方法重写中
如果重写的方法抛出的是一个Non-Runtime Exception
- 子类方法抛出的异常需要父类方法抛出异常的子类型,或者等同于父类方法抛出的异常类型
- 不能让子类重写的方法抛出异常的类型高于父类方法抛出的异常类型
自定义异常
系统给我们提供了很多的异常类,但是这些异常类并不能够满足我们所有的需求。这种情况下,我们就需要去自定义异常。继承自异常类,写一个子类即可。
自定义RuntimeException
继承自RuntimeException类,写一个子类。这个子类异常就是一个运行时异常。
class NumberOfLegException extends RuntimeException { /** * 通过一个异常描述信息来实例化一个异常对象 * @param message */ public NumberOfLegException(String message) { // 怎么样去设置这个异常信息? super(message); } }
自定义Non-Runtime Exception
继承自Exception类,写一个子类。这个子类异常就是一个非运行时异常。
class NumberOfLegException extends Exception { /** * 通过一个异常描述信息来实例化一个异常对象 * @param message */ public NumberOfLegException(String message) { // 怎么样去设置这个异常信息? super(message); } }
在自定义异常类的时候,类名最好使用Exception作为结尾
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
好程序员Java教程分享Java之设计模式
好程序员Java实用教程之设计模式,首先来讲一下单例设计模式 单例设计模式 /* * 设计模式:前人总结出来的对一些常见问题的解决方案,后人直接拿来使用. * 常用的设计模式:单例,工厂,代理,适配器,装饰,模板,观察者等,一共有23种 * 单例:一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用. * * 分析: * 1.我们肯定要建立一个单例类来描述 * 2.只允许有一个对象 * 3.全局的访问点:说的就是当前的s----通过static实现的 * 4.提供出去 * 5.给大家使用 * * 分类: * 饿汉式:在定义当前单例类对象成员变量时直接初始化. * 懒汉式:什么时候用什么时候赋值(在公共方法中进行赋值) * * 作用: * 1.传值 * 2.作为全局的访问点. * *使用单例传值的好处: * * 好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性 * * 耦合性,内聚性在微观上说:描述的是类与类之间的关系 * 好处:我们应该尽量提高内聚性,减少耦合性,可以提高程序的健壮性,增加代码的可移植性,方便实现模块儿化编程 * * 如何...
- 下一篇
好程序员Java教程分享Java之包装类与常用类
好程序员Java教程分享Java之包装类与常用类,首先来讲一下包装类 基本数据类型(值类型):byte, short, int, long, float, double, char, boolean 包装类:将基本数据类型,用一个类进行了一层包装,可以按照引用类型进行使用。同时还提供了若干用来进行数据转换的操作。 包装类按照基本数据类型的包装功能,分为八种: 基本数据类型 包装类型 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 数据的装箱与拆箱: 装箱:由基本数据类型,转型为包装类型 int a = 10; // 通过构造方法进行装箱 Integer i1 = new Integer(a); // 通过valueOf方法进行装箱 Integer i2 = Integer.valueOf(a); 拆箱:由包装类型,转型为基本数据类型 Integer i = new Integer(10); int a = i.intValue(); ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)