Java异常机制简介
什么是异常?
异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响。
Java异常的分类:
Java是一种面向对象的编程语言,Java把异常也看成是一个对象。Throwable是所有异常的父类,有两个子类继承于他,分别是Exception和Error,Exception是我们经常看到的异常的父类,而Error我们很少遇到过,出现Error这种错误的时候我们是无法通过更改代码解决的,例如虚拟机运行出现错误等。
Exception在书上被分为运行时异常,和非运行时异常,很好理解,运行时异常也是非检查异常,Java编译器不会去检查他,即使没有try-catch处理,throws抛出,程序还是会编译通过。就是在程序运行的时候会出现错误,由于程序代码不会处理运行时异常,如果出现就会导致程序运行的终止。如下图的空指针异常和数组下标越界异常,是我们代码运行出错导致的,我们可以通过改变代码的结构避免此类异常的出现。
非运行时异常也叫受检查异常,除了运行时异常及其子类以外,其他的Exception类及其子类都属于受检查异常,如下图的IOException,SQLException。这种异常的特点就是Java编译器会检查他,在程序运行前,如果不加处理,编译器就会提示,程序无法编译运行,要么用try-catch捕获,要么throws抛出。
Java处理异常的机制:
Java是一种面向对象的编程语言,同样把异常也用面向对象的思想进行处理,使程序有更好的维护性。
当程序中的语句可能抛出异常的时候,有两种处理方式:
说处理方式之前先记住Java异常这里的五个关键字:try,catch,finally,throw,throws
利用try-catch语句捕获并处理异常
- 在出现异常所在的方法声明处通过throws声明抛出异常,这种处理异常方式不太友好。
第一种利用try-catch语句捕获并处理异常,把可能出现异常的语句放在try语句块中(尝试着运行),catch捕获可能出现的异常,catch语句块中写入处理异常的语句,一般情况下我们在catch中写入处理异常的代码。注意try代码块不能单独出现,后面必须有catch或者finally代码块,在catch和finally代码块共存的时候,finally代码块一定要在catch后面,finally代码块是在最后执行的,例如我们连接数据库操作之后,一般吧资源的关闭操作都写在finally代码块中。在try后面的catch代码块会依次执行,直到捕获到异常。在各个代码块中定义的变量属于局部变量,不能在其他的代码块中使用。
try {
// 要出现异常的代码
throw new IOException();
} catch (IOException e) {
// 处理异常语句
} finally {
// 最终执行的代码
}
这里细说一下finally关键字,finally最终的意思,也就是说finally中的代码最后一定会被执行,编译器确实也是这么做的,不管return写在了finally代码块之前还是之后,finally中的代码一定会被执行完之后再执行return返回,这是一道面试题,考察的就是finally代码块执行的方式。
public static void print() {
try {
System.out.println("try");
return;
}finally {
System.out.println("finally");
}
}
当执行上面的代码输出的是:
try
finally
也就说finally中的代码在return之前执行了
第二种利用关键字throws声明抛出异常:throws关键字一定是在方法声明的后面,个人认为这种处理异常的方式是很不负责任的行为,如果一个方法中的代码可能出现异常,没有能力来处理这个异常,就要把这个异常抛出,当某个方法调用这个抛出异常的代码的时候,如果还没有处理这个异常那就还要抛出,一级一级的,直到有方法处理了这个异常。
public void print() throws IOException {
throw new IOException();
}
上面的方法体中抛出异常的语句,抛出的异常对象必须是Thtoeable类或者是其子类
throw new String("不是异常");
以上代码不合法,String类不是异常类
自定义异常:
有时候我们可能在特定的处理业务上有着自己的一套异常信息,原有的异常类不能满足我们的需求,就需要我们扩展异常,自定义异常。继承Exception
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
public MyException() {
}
}
使用:
public static void print() {
try {
throw new MyException("除数为0");
} catch (MyException e) {
e.printStackTrace();
}
}
调用输出:
我们平时写异常的代码的时候经常是在catch代码块中用printStackTrace()方法将异常信息输出,其实不是处理异常,只是测试时候可以看到出现了什么异常。很多代码中的异常都是由于书写的逻辑有问题,只要适当改变代码结构,即可避免异常的产生。
Java异常机制简介的更多相关文章
- 全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...
- Java 异常机制
Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...
- 【55】java异常机制剖析
一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...
- Java异常机制及异常处理建议
1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- Java异常机制
Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...
- Java基础 -- 深入理解Java异常机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...
- 一张图搞清楚Java异常机制
下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...
- Java异常机制,自定义异常以及spring boot异常设计方案
异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案
随机推荐
- HDP2.0测试
1.测试Hbase (1)hive导入hbase
- iOS 开发之内存泄漏问题
关于内存泄漏问题,一般情况下就是控制器或者视图没有正常的释放引起的,我们通常可以通过dealloc方法来检查一个控制器或者视图是否释放. 对于一个控制器或者视图没有释放,其实也就是还有强引用引用着这个 ...
- linux kvm虚拟机快速构建及磁盘类型
KVM命令管理 virsh命令:用来管理各虚拟机的接口命令查看/创建/停止/关闭...支持交互模式格式:virsh 控制指令 [虚拟机名称] [参数] [root@room1pc01 桌面]# vir ...
- 兼容ie7以上的 placeholder属性
最近项目踩过的坑,不考虑ie的可以拐弯绕路走了. css3的新属性 占位符 placeholder用着多舒服 . 偏偏万恶的ie不支持,网上有几种方法是用焦点事件代替的,不过会失去原有的特性.一旦获取 ...
- Android热修复(动态加载)方案汇总
整理了以下动态加载的方案,便于在项目中使用时查阅: Dexposed github (https://github.com/alibaba/dexposed) AndFix github (https ...
- Jlink 烧写Uboot
第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明 如果您是首次安装本SDK,请直接参看第2章. 第二章首次安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100 ...
- Sublime codeIntel 配置支持php自动提示
Sublime codeIntel 配置支持php自动提示 下载地址:https://github.com/SublimeCodeIntel/SublimeCodeIntel 安装方法:下载后放到su ...
- mysql学习笔记02 CRUD操作
添加数据insert into 表名(字段列表) values(对应字段的列表值) 查询数据 select *from 表名 where 条件select *from 表名 where 1条件 1表示 ...
- RTP、RTCP、RTSP 概念
用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制.同步. 之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码 ...
- 【CJOJ1494】【洛谷2756】飞行员配对方案问题
题面 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1 ...