22. 异常(Eception)
1. 现实生活的病
现实生活中万物在发展和变化会出现各种各样不正常的现象。
1)例如:人的成长过程中会生病。
|——病
|——不可治愈(癌症晚期)
|——可治愈
|——小病自行解决(上火,牙痛)
|——去医院(感冒,发烧)
同时我们的java也可以诊断和处理这些异常
注意:
除了RunntimeException和它的子类以外,其他的都是编译时异常,我们可以在api文档中查找,并不需要死记硬背
2. java异常体系图
|——Throwable (实现类描述java的错误和异常)
|——Error (错误)一般不通过代码去处理。
|——Exceprion (异常)
|——RuntimeException (运行时异常)jvm不强制要求进行处理
|——编译时异常 jvm强制要求进行处理
1)苦恼1:为什么Error错误一般不需要代码去处理呢?
因为有些错误程序员是很难避免的,例如内存溢出,jvm默认管理的内存为64G如果超出这个范围就会报错
//定义一个1G内存的数组
byte[] buf = new byte[2014*2014*2014];
System.out.println(buf);
报错:
错误(Error):
它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。错误是JVM的一个故障(虽然它可以是任何系统级的服务)。
所以,错误是很难处理的,一般的开发人员是无法处理这些错误的。比如内存溢出.
2)苦恼2:为什么编译时异常jvm强制要求处理,而运行时异常jvm不强制要求处理呢?
因为运行时异常可以通过程序员良好的编程习惯而避免,程序员可以直接找到问题代码进行处理,防止这种情况发生
例如:
当我们执行除法运算的时候我们只需要在方法里面加一个if判断(被除数不能为0),就可以避免被除数为0的情况
而不需要抛出处理或者try...catch
注意:
a.运行时异常编译器不会检查程序员是否处理该异常,所以我们应该尽量避免这种异常的出现
3.自行处理(try...catch)
1)单个异常处理
例如:
class Demo2
{
public static void main(String[] args)
{
div(4,0);
} public static void div(int a , int b){ try{ System.out.println(a/b);//可能出现的异常 }catch(ArithmeticException e){//异常匹配 e.printStackTrace();
System.out.println("除数不能为0");
}
System.out.println("运算除法");
}
}
注意:
a.如果不用处理异常,在程序运行到病态代码时,后面的代码不会执行。如果处理了,后面的代码会正常执行
b.如果我们需要一次处理多个异常我们需要在后面多添加几个catch语句
2)多个异常处理
例如:
class Demo2
{
public static void main(String[] args)
{
int[] arr = { 1, 2 };
arr = null;
div(4,0,arr);
} public static void div(int a , int b, int[] arr){ try{
System.out.println(arr[1]);//会报空指针异常
System.out.println(a/b); //运算异常 }catch(ArithmeticException e){//异常匹配 e.printStackTrace();
System.out.println("除数不能为0");
}catch(NullPointerException e){
e.printStackTrace();
System.out.println("数组为空");
}
System.out.println("运算除法");
}
}
注意:
a.try中多个异常同时出现,只会处理第一条出现异常的语句,剩余的异常不再处理。
苦恼:如果是这样,难道我要记住所有的预定义异常吗?
其实我们可以用多态的方式来捕获异常,进行处理
例如:
class Demo2
{
public static void main(String[] args)
{
div(4,0);
} public static void div(int a , int b){ try{
System.out.println(a/b); //运算异常 }catch(Exception e){//异常匹配
e.printStackTrace();
System.out.println("除数不能为0"); }
}
}
注意:
因为Exception是所有异常的父类所以无论try语句块中出现何种错误,都会进行处理,这样导致的是,我们没办法对特定异常进行特定的处理。
所以我们一般在catch(Exception e)前捕获一些我们知道可能要出现异常的代码,而把catch(Exception e)写在后面防止我们不知道的异常发生
3.抛出异常(throw throws)
1)语法
throws 异常名 声明异常
throw new 异常名 抛出异常
2)代码:
class Demo2
{
public static void main(String[] args)
{
try{
div(4,0);
}catch(Exception e){
e.printStackTrace();
}
} public static void div(int a , int b) throws Exception{ if(b == 0){
throw new Exception("除数为0");
}
}
}
注意:
a.如果调用抛出异常的方法时,调用者必须处理异常或者抛出代码.
苦恼:main方法抛出异常谁去处理呢?
因为程序运行时jvm会调用main方法,所以如果main方法抛出异常jvm会自动处理
代码:
public static void main(String[] args) throws Exception
{
div(4,0);
}
在实际的开发中预定义的异常并不能帮我们解决所有问题,这时我们就需要自定义异常了
4.自定义异常
实例代码:
/*
需求:模拟自己去吃木桶饭,如果没有带够10块,就抛出异常
带够就吃木桶饭
Exception的构造方法:
1. Exception() 构造详细消息为 null 的新异常。
2. Exception(String message) 构造带指定详细消息的新异常。
3. Exception(String message, Throwable cause) 构造带指定详细消息和原因的新异常。
4. Exception(Throwable cause)
根据指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包含 cause 的类和详细消息)。
*/
class MoneyException extends Exception{
public MoneyException(String message){
//调用Exception一个参数的构造方法
super(message);
}
}
class Demo1{
public static void main(String[] args) {
int money = 5;
try{
eat(money);
}catch(MoneyException e){
e.printStackTrace();
System.out.println("跟我洗一个月的碗吧!");
}
}
public static void eat(int money)throws MoneyException{
if(money<10){
throw new MoneyException("吃霸王餐");
}
System.out.println("吃香喷喷的饭吧!");
}
}
5. finally语句
3)定义:
无论程序正常还是异常,都会执行finally,除非jvm停止(System.exit(0))
2)运用:
因为我们不能对一个文件同时进行修改和删除,当一个人在删除文件时代码报错,这个时候我们就要释放资源(finally一般用于释放资源)
3)语法:
a.try{ // 可能发生异常的代码 } catch( 异常类的类型 e ){ // 当发生指定异常的时候的处理代码 }catch...
比较适合用于专门的处理异常的代码,不适合释放资源的代码
b.try{ } catch(){} finally{ // 释放资源的代码 }
比较适合用于既要处理异常又有资源释放的代码
C.try{ }finally{ // 释放资源 }
比较适合处理的都是运行时异常且有资源释放的代码。
22. 异常(Eception)的更多相关文章
- Java基础教程(22)--异常
一.什么是异常 异常就是发生在程序的执行期间,破坏程序指令的正常流程的事件.当方法中出现错误时,该方法会创建一个对象并将其交给运行时系统.该对象称为异常对象,它包含有关错误的信息,包括错误的类型和 ...
- WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)
WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...
- HIbernate常见异常(转载)
SSH阶段常见的异常系列之一hibernate(15条) 异常一 异常一 异常描述: Sax解析异常:cvc-复杂的类型,发现了以元素maping开头的无效内容,应该是以 ‘{“http://www. ...
- Hibernate 异常总结
异常一 异常一 异常描述: Sax解析异常:cvc-复杂的类型,发现了以元素maping开头的无效内容,应该是以 ‘{“http://www.hibernate.org/xsd/orm/cfg“:pr ...
- java web学习总结(三十) -------------------JSTL表达式
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- javaweb学习总结(二十八)——JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- cglib invoke 和 invokeSuper 可用的组合
在深入字节码理解invokeSuper无限循环的原因中,我们理解的cglib的原理和其中一个合理的调用方式.但是这个调用方式是基于类的,对所有实例生效.实际场景中,我们可能只是希望代理某个具体的实例, ...
- Python数据分析之文本处理词频统计
1.项目背景: 原本计划着爬某房产网站的数据做点分析, 结果数据太烂了,链家网的数据干净点, 但都是新开楼盘,没有时间维度,分析意义不大. 学习的步伐不能ting,自然语言处理还的go on 2.分析 ...
随机推荐
- handsontable 随记
handsontable 怎么样获取合并之后的cell信息,如下 handsontable .getPlugin('mergeCells').mergedCellsCollection 看了他的源代码 ...
- 【LeetCode】Math
[263] Ugly Number [Easy] 一个数的质因子只有2,3,5就叫丑数,写个函数判断丑数. //Author: Wanying //注意 0 和 1 的corner case, 你居然 ...
- asp.net网站Application_Start疑是不执行的现象
今天遇见了一个很诡异的事情,发布了新代码后,发现在Application_Start中读取的一些配置参数变为空了,最开始我以为是什么特殊的原因程序没有执行Application_Start,导致它们的 ...
- 【JavaWeb项目】一个众筹网站的开发(九)邮件开发
Java官方支持邮件开发,Javax-mail jdk中默认没有,需要另外下载 apache的基于Javax-mail开发了commons-mail,更加简单高效,推荐使用 一.电子邮件接收和发送协议 ...
- SQL复制数据表及表结构
select * into 目标表名 from 源表名 insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名 以上两句都是将'源表'的数据插入到'目 ...
- 【Flutter学习】之VSCode下Flutter常用终端命令行
Flutter 常用命令行 相关项目操作 查看Flutter版本 查看当前版本 flutter --version 查看所有版本 flutter version 打印所有命令行用法信息 flutter ...
- (53)C# 工具
https://docs.microsoft.com/zh-cn/dotnet/framework/tools/ildasm-exe-il-disassembler 一.Visual Studio的开 ...
- Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议
目录 目录 前言 Openstack基金委员会 Openstack贡献者须知 注册Openstack In Launchpad 生成并上传OpenPGP密钥 生成并上传SSH公钥 Join The O ...
- 屏幕左侧鼠标常驻,隐藏部分显示,文章鼠标常驻,隐藏部分隐藏(我的hexo next博客)
文章目录 如图 功能 代码 博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu?tab=repositories 如图 功能 最左侧添加透明 ...
- Bootstrap-table 使用总结 转载https://www.cnblogs.com/laowangc/p/8875526.html
一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...