《疯狂Java讲义》10
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相关推荐
- 关于《那些年啊,那些事——一个程序员的奋斗史》——24提到的鼻炎治疗方法
在<那些年啊,那些事--一个程序员的奋斗史>--24中有提到用清水治疗鼻炎的方法,很多朋友在留言或email都有问到这问题,在此一并做个回答. 简单说说norains的鼻炎 ...
- 《那些年啊,那些事——一个程序员的奋斗史》十四(完结)
125 距离离职交接的一个月时间还剩几天,本来应该是平淡无事的,却没想到最后还是波澜四起.昨天下班前,公司突然停了电.这本是件普通得不能再普通的事情,可没想到过了一会来电了,或许是波峰电压太大,或许是 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)
周五,如约而至.张文香果然没有被邀请,武总自然也是被排除之列,来的都是平时大家谈得比较来的.几个月不见,小黑和小蓝还是老样子,但精神相比以前是好多了:麦吉则没什么太大的变化,倒是陈莉胖了不少,颇有一番 ...
- 关于 那些年啊,那些事——一个程序员的奋斗史 ——24提到的鼻炎治疗方法
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 在<那些年啊 ...
- 关于 那些年啊 那些事 一个程序员的奋斗史 24提到的鼻炎治疗方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在< ...
- 《那些年啊,那些事——一个程序员的奋斗史》——79
旧的4.3'主板是废弃了,新的带CMMB的板子开始了.对于新的板子来说,其实只是在旧的板子上做改动,比如删掉蓝牙模块啊,去掉视频输入啊等:最大的不同,只是根据Telechips的原理图增加CMMB部分 ...
- 那些年啊,那些事——一个程序员的奋斗史 ——23
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow "开会咯 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——23
"开会咯!"黄华中在研发部嚷了一下,让大家到外面的会议桌去.说起来,自从段伏枥来到这公司以来,已经差不多有好几个月,却连一个会都没有开过,甚至是小一点的内部会议都没有.为什么突然间 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——117
这段时间段伏枥在折腾.NET Micro Framework的时候,终于体会到什么叫举步维艰了.因为这玩意没有操作系统做支撑,直接是操作硬件,有时候出问题了,根本就不知道是如何引起的. 比如说,在移植 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——38
自从会见了律师之后,时间又过了一周,期间还是和往常没什么两样,段伏枥依然还是赶最后一班公交,周六还是依然需要加班.不过,经过王健的努力,这板子终究还是跑起来了.不过,这跑起来的概念也就是能够进入Win ...
最新文章
- 航天智慧物流线上预选赛-成绩公布
- HTML5实战 学习笔记
- 【收藏】k8s: pod has unbound PersistentVolumeClaims问题解决
- 最小生成树--prim+优先队列优化模板
- 【ArcGIS遇上Python】Python使用栅格数据
- React Native之hardwareBackPress
- 前端基础-html-表格的标题和表头单元格标签
- c语言如何在手机上运行程序,各位前辈这两个程序怎么在手机上运行
- python 读取PDF内容(推荐pdfplumber)
- 实现ViewPager动态添加和删除页面
- 修改CentOS默认yum源地址提高下载速度
- 2022-10-11 myql-exists子查询外表关联记录
- 白岩松人生哲学-听后感
- Livid : 在 26 岁时写给 18 岁的自己
- BoCloud花磊:专注金融IT架构的变革
- conemu 打开wsl 报错
- 特斯拉充电电流设置多大_特斯拉充电要多久
- Java版浏览器源代码(可以打开html文件)下载
- 使用postgresql和Arcgis创建路网拓扑结构
- android 彩信接收到附件的下载原理分析