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)的更多相关文章

  1. Java基础教程(22)--异常

    一.什么是异常   异常就是发生在程序的执行期间,破坏程序指令的正常流程的事件.当方法中出现错误时,该方法会创建一个对象并将其交给运行时系统.该对象称为异常对象,它包含有关错误的信息,包括错误的类型和 ...

  2. WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...

  3. HIbernate常见异常(转载)

    SSH阶段常见的异常系列之一hibernate(15条) 异常一 异常一 异常描述: Sax解析异常:cvc-复杂的类型,发现了以元素maping开头的无效内容,应该是以 ‘{“http://www. ...

  4. Hibernate 异常总结

    异常一 异常一 异常描述: Sax解析异常:cvc-复杂的类型,发现了以元素maping开头的无效内容,应该是以 ‘{“http://www.hibernate.org/xsd/orm/cfg“:pr ...

  5. java web学习总结(三十) -------------------JSTL表达式

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  6. JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  7. javaweb学习总结(二十八)——JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  8. cglib invoke 和 invokeSuper 可用的组合

    在深入字节码理解invokeSuper无限循环的原因中,我们理解的cglib的原理和其中一个合理的调用方式.但是这个调用方式是基于类的,对所有实例生效.实际场景中,我们可能只是希望代理某个具体的实例, ...

  9. Python数据分析之文本处理词频统计

    1.项目背景: 原本计划着爬某房产网站的数据做点分析, 结果数据太烂了,链家网的数据干净点, 但都是新开楼盘,没有时间维度,分析意义不大. 学习的步伐不能ting,自然语言处理还的go on 2.分析 ...

随机推荐

  1. handsontable 随记

    handsontable 怎么样获取合并之后的cell信息,如下 handsontable .getPlugin('mergeCells').mergedCellsCollection 看了他的源代码 ...

  2. 【LeetCode】Math

    [263] Ugly Number [Easy] 一个数的质因子只有2,3,5就叫丑数,写个函数判断丑数. //Author: Wanying //注意 0 和 1 的corner case, 你居然 ...

  3. asp.net网站Application_Start疑是不执行的现象

    今天遇见了一个很诡异的事情,发布了新代码后,发现在Application_Start中读取的一些配置参数变为空了,最开始我以为是什么特殊的原因程序没有执行Application_Start,导致它们的 ...

  4. 【JavaWeb项目】一个众筹网站的开发(九)邮件开发

    Java官方支持邮件开发,Javax-mail jdk中默认没有,需要另外下载 apache的基于Javax-mail开发了commons-mail,更加简单高效,推荐使用 一.电子邮件接收和发送协议 ...

  5. SQL复制数据表及表结构

    select * into 目标表名 from 源表名 insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名 以上两句都是将'源表'的数据插入到'目 ...

  6. 【Flutter学习】之VSCode下Flutter常用终端命令行

    Flutter 常用命令行 相关项目操作 查看Flutter版本 查看当前版本 flutter --version 查看所有版本 flutter version 打印所有命令行用法信息 flutter ...

  7. (53)C# 工具

    https://docs.microsoft.com/zh-cn/dotnet/framework/tools/ildasm-exe-il-disassembler 一.Visual Studio的开 ...

  8. Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议

    目录 目录 前言 Openstack基金委员会 Openstack贡献者须知 注册Openstack In Launchpad 生成并上传OpenPGP密钥 生成并上传SSH公钥 Join The O ...

  9. 屏幕左侧鼠标常驻,隐藏部分显示,文章鼠标常驻,隐藏部分隐藏(我的hexo next博客)

    文章目录 如图 功能 代码 博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu?tab=repositories 如图 功能 最左侧添加透明 ...

  10. Bootstrap-table 使用总结 转载https://www.cnblogs.com/laowangc/p/8875526.html

    一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...