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.分析 ...
随机推荐
- Java Socket NIO示例总结
Java NIO是非阻塞IO的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等等,它主要有三个部分组成: Channels Buffers Se ...
- Spring Boot,Spring Data JPA多数据源支持配置
1 配置文件 wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver wisely.primary.datasource. ...
- shell位置参数和 shift 命令
- 视频专家之路【二】:ffmpeg工具的使用
本文是听了雷宵骅大神的课之后的总结,部分内容借用了其PPT的内容,如有侵权请告知删除. 雷宵骅大神的博客为:https://blog.csdn.net/leixiaohua1020 要学习汽修,那么首 ...
- python_django_富文本
下载富文本: pip install django-tinymce 一.配置 在settings.py文件INSTALLED_APPS中添加:'tinymce': 二.应用 1.在admin中使用 a ...
- css盒模型宽高混合计算calc
例如: .element{ width:calc(expression); } 兼容性:在IE9+.FF4.0+.Chrome19+.Safari6+都得到了较好支持,但是在移动端的支持不是很好. 其 ...
- Delphi 类(TApplication)
TApplication类用于开发窗口程序的类.此类封装了一个窗口应用程序,其方法和属性反映了窗口操作系统在建立.执行.维持以及析构该程序等方面的基本原则.Delphi的每个窗口程序都会自动声明一个A ...
- SnowFlakeId 分布式雪花id算法
package com.jn.baseservice.utils; import com.jn.baseservice.common.Number; import lombok.Getter; imp ...
- vue基础四
1.绑定Html Class(在 v-bind 用于 class 和 style 时, Vue.js 专门增强了它.表达式的结果类型除了字符串之外,还可以是对象或数组) 1.1对象语法 传给v-bin ...
- luoguP1288 取数游戏II [博弈论]
题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...