1. Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字。

2.Java的异常分为两种,Checked异常和Runtime异常,Java认为Checked异常是在编译时可以处理的异常,所以它强制Java处理所有的Checked异常,而Runtime异常无需处理.

3. 使用try...catch来捕获异常:

语法结构为如下:

4. 如果执行try块中的代码出现了异常情况,系统会自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程称为抛出异常。当Java运行时环境接受到这个异常时,会寻找处理该对象的Catch块,如果找到合适的catch块,就把对象交给这个catch快进行处理,这个过程称为捕获异常,当然了,如果没有找到合适的catch块,那么程序将终止。

5. 程序在执行try中的代码时,如果遇到异常,就会产生Exception,上面也提到了,会调用合适的catch来进行处理。这里要说明的是,每一个可以接收的异常都有自己相对应的catch语句,也就是有唯一性。

6. Java把所有的非正常情况分为两种,一种是异常(Exception),一种是错误(Error)。Error错误一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失效等。这种错误无法恢复或不可能捕获,将导致应用程序中断,因此应用程序不应该试图使用catch块来捕获Error对象。

7. try语句与if语句的区别:

try和catch语句后面的花括号不能省略,但是if后面如果只有一行语句,花括号是可以省略的。

8. 看一个捕获异常的栗子:   

写法就是酱紫的。红框框出来的是try和catch的用法栗子,紫色的框出来的是之前我们讲过的Scanner的用法。

给大家看一下结果:

示例1:

示例2:

换一种输入方法:

我们再试试捕获不同异常:

示例3:

如果把括号内的数据换成:

结果为(示例4):

上面的几种异常处理较为常见,熟悉最好。

9. 捕获异常时,注意先捕获小异常,再捕获大异常。就是说,范围大些的放在程序的后面,更为具体的放在前面。用上面的例子来说,就是将

红框内的内容往后放,因为这个包含的情况很多,上面的都比较具体,所以先小后大。再例如:运行时异常应该放在空指针异常的后面。

10. Java7提供的多异常捕获

在Java7之前,每个catch只能捕获一种异常,但是Java7之后,一个catch块可以捕获多种异常。

先看一下示例吧:

上面和之前的代码一样,结果如下:

这就是多异常捕获,需要注意的两点是:

(1)书写问题:多个异常中间用“|”隔开:

(2)捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序变量不能对异常变量重新赋值。

举个栗子:

看一下编译信息:

但是如果是只捕获一种异常变量的话,就可以重新赋值:

编译没有问题。

11. 访问异常信息

(下面乌拉乌拉一堆字可以都不看,吃栗子)

    如果程序需要在catch块中访问异常对象的相关信息,则可以通过访问catch块的后异常形参来获得。当Java运行时决定调用某个catch块来处理该异常对象时,会将异常对象赋值给catch块后的异常参数,程序就可以通过该参数获得异常的相关信息。

来~栗子:

结果如下:

    所有的异常对象都包含了如下几个常用的方法:

    1)getMessage():返回该异常的详细描述字符串;

2)printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

3)printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流;

4)getStackTrace():返回该异常的跟踪栈信息。

12. 使用finally回收资源

(下面的字可以只看粗体)

    如果程序在try中打开了物理资源(例如数据库连接,网络连接和磁盘文件等),这些物理资源必须显示回收。之前我们讲垃圾回收机制的时候说过,系统只能自动回收一些内存中的对象所占用的内存,不能回收物理资源。所以怎么办?如果在try或者catch中进行回收处理,程序可能得不到执行,所以我们不能放在这两个地方。为了解决这个问题,异常处理机制提供了finally块,不论是否出现异常,finally都会执行。多个catch块放在try之后,finally块放在catch块之后。

来~栗子:

结果如下:

 再来~栗子:

在上面的try里稍作改动,如上图。结果不变。这说明什么?我们印象中的return还是比较厉害的,一般方法执行到return都会结束,但是这里并没有结束,finally还是会继续执行,这里要注意一下。但是并不是说我们对finally无可奈何了。

又来~栗子:

这个语句含义是退出虚拟机,所以程序不会执行finally块,结果如下:

13. 上面我们说到可以用finally块对物理资源进行回收,但是也可以看到,代码量会增加很多。Java7后,提供了一种看起来较为简单的方法,看例子:

但是,说实话,我不喜欢这个写法,可能以后是得这么用,但是,,,以后再说(傲娇脸.jpg || 傲娇脸.gif)

14. 使用throws声明抛出异常

    使用throws声明抛出异常的思路是:当前方法不知道如何处理异常,交给上一级去处理。如果main方法不知道如何处理,也可以使用throws声明抛出异常,交给虚拟机处理。虚拟机处理的方式是打印异常的跟踪栈信息,并终止程序运行(就是我们上面举过的例子)。

throws声明抛出异常的语法格式为:

throws ExceptionClass1,ExceptionClass2...

用throws的话就不用try...catch了。

举个栗子:

这个程序结果和我们之前用try...catch的结果是一样的。

END

《疯狂Java讲义》10相关推荐

  1. 关于《那些年啊,那些事——一个程序员的奋斗史》——24提到的鼻炎治疗方法

    在<那些年啊,那些事--一个程序员的奋斗史>--24中有提到用清水治疗鼻炎的方法,很多朋友在留言或email都有问到这问题,在此一并做个回答.         简单说说norains的鼻炎 ...

  2. 《那些年啊,那些事——一个程序员的奋斗史》十四(完结)

    125 距离离职交接的一个月时间还剩几天,本来应该是平淡无事的,却没想到最后还是波澜四起.昨天下班前,公司突然停了电.这本是件普通得不能再普通的事情,可没想到过了一会来电了,或许是波峰电压太大,或许是 ...

  3. 《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)

    周五,如约而至.张文香果然没有被邀请,武总自然也是被排除之列,来的都是平时大家谈得比较来的.几个月不见,小黑和小蓝还是老样子,但精神相比以前是好多了:麦吉则没什么太大的变化,倒是陈莉胖了不少,颇有一番 ...

  4. 关于 那些年啊,那些事——一个程序员的奋斗史 ——24提到的鼻炎治疗方法

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 在<那些年啊 ...

  5. 关于 那些年啊 那些事 一个程序员的奋斗史 24提到的鼻炎治疗方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在< ...

  6. 《那些年啊,那些事——一个程序员的奋斗史》——79

    旧的4.3'主板是废弃了,新的带CMMB的板子开始了.对于新的板子来说,其实只是在旧的板子上做改动,比如删掉蓝牙模块啊,去掉视频输入啊等:最大的不同,只是根据Telechips的原理图增加CMMB部分 ...

  7. 那些年啊,那些事——一个程序员的奋斗史 ——23

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow "开会咯 ...

  8. 《那些年啊,那些事——一个程序员的奋斗史》——23

    "开会咯!"黄华中在研发部嚷了一下,让大家到外面的会议桌去.说起来,自从段伏枥来到这公司以来,已经差不多有好几个月,却连一个会都没有开过,甚至是小一点的内部会议都没有.为什么突然间 ...

  9. 《那些年啊,那些事——一个程序员的奋斗史》——117

    这段时间段伏枥在折腾.NET Micro Framework的时候,终于体会到什么叫举步维艰了.因为这玩意没有操作系统做支撑,直接是操作硬件,有时候出问题了,根本就不知道是如何引起的. 比如说,在移植 ...

  10. 《那些年啊,那些事——一个程序员的奋斗史》——38

    自从会见了律师之后,时间又过了一周,期间还是和往常没什么两样,段伏枥依然还是赶最后一班公交,周六还是依然需要加班.不过,经过王健的努力,这板子终究还是跑起来了.不过,这跑起来的概念也就是能够进入Win ...

最新文章

  1. 航天智慧物流线上预选赛-成绩公布
  2. HTML5实战 学习笔记
  3. 【收藏】k8s: pod has unbound PersistentVolumeClaims问题解决
  4. 最小生成树--prim+优先队列优化模板
  5. 【ArcGIS遇上Python】Python使用栅格数据
  6. React Native之hardwareBackPress
  7. 前端基础-html-表格的标题和表头单元格标签
  8. c语言如何在手机上运行程序,各位前辈这两个程序怎么在手机上运行
  9. python 读取PDF内容(推荐pdfplumber)
  10. 实现ViewPager动态添加和删除页面
  11. 修改CentOS默认yum源地址提高下载速度
  12. 2022-10-11 myql-exists子查询外表关联记录
  13. 白岩松人生哲学-听后感
  14. Livid : 在 26 岁时写给 18 岁的自己
  15. BoCloud花磊:专注金融IT架构的变革
  16. conemu 打开wsl 报错
  17. 特斯拉充电电流设置多大_特斯拉充电要多久
  18. Java版浏览器源代码(可以打开html文件)下载
  19. 使用postgresql和Arcgis创建路网拓扑结构
  20. android 彩信接收到附件的下载原理分析

热门文章

  1. 给网站配置免费的HTTS证书 1
  2. 【Java框架】 Hibernate与Mybatis对比
  3. 本机镜像仓库base64解密
  4. 一个SQL Server Sa密码破解的存储过程
  5. BaseAdapter的一个简单案例
  6. 微服务网关 Kong 科普
  7. Spring Boot 注册 Servlet 的3种方式
  8. 简单易懂的自动驾驶科普知识
  9. 跟着 Github 学习 Restful HTTP API 的优雅设计
  10. 理解分布式系统中的缓存架构(上)