当前课程知识点:Java程序设计 > 第五章 输入输出 > 5.1.3-5.1.5-异常的处理 > 5.1.3-5.1.5-异常的处理
大家好
欢迎回来继续学习
Java语言程序设计
这一节我们来学习异常的处理
对于检查型的异常
我们的程序是必须关注的
关注的方式有两种
第一种可以是不打算处理
那你就要声明说
我要继续抛出这种异常
那么不打算在当前方法内处理
那就可以使用throws子句
将这个异常抛出到调用者方法中
那么我们想一想如果我们程序中
所有的方法都选择了
抛出某种类型的异常
那也就是我们整个程序
都不打算处理这个异常
那最后它抛到哪儿去了呢
最后它就抛给Java虚拟机了
那么Java虚拟机就会捕获它
并且输出相关的错误信息
终止程序的运行
当然更多的情况下
我们应该负起责任来处理异常
那么就要使用try-catch
这样一套机制去捕获异常
然后进行相应的处理
下面我们来看这个图
这个图上示意性的
画出了方法之间的一个调用关系
它的意思是方法1
Method1调用方法2
然后方法2调用方法3
方法3调用方法4
这个时候如果在方法4中
探测到有异常发生
那方法4可能选择说
我不处理这个异常
我抛出这个异常
那么抛到哪儿去了呢
就会沿着调用栈的方向向上抛出
也就是说方法4会把这个异常
抛给它的调用者方法3
方法3如果不处理
就继续抛给方法2
方法2要依然不处理
它可能抛给方法1
那这个时候如果方法1
打算在这个地方处理异常
那么它就应该捕获异常
并且就地处理
下面我们来看一个
不捕获直接抛出异常的例子
在这个例题中我们模拟
调用一个文件访问的方法
在这个文件访问方法中
是有可能抛出异常的
当然我们现在还没有讲
怎么样访问文件
所以这个文件访问的具体代码
我们就省略了
但是open ThisFile
这个方法它声明了
有可能抛出文件找不到这种异常
于是我们这个getCustomerInfo这个方法
去调用了open ThisFile方法
那就说明在这个方法中
也是有可能发生异常的
因为它调用的异常
有可能把异常向上抛出到这个位置
那我们写的get CustomerInfo方法
有两个选择
一个是自己捕获处理异常
另一个就是声明
我不处理我也继续抛出
那在这个例子里面
它声明了继续抛出这种异常
这个异常就又抛出
给它的调用者了
如果我们需要在当前方法中
捕获并且处理异常
那么该怎么做呢
大家看这里给出了
try catch finally语句
如果我们需要在当前方法中
处理这个异常
那么我们就要
将有可能产生异常的代码块
放在try语句之中
那么跟在try语句之后
是这个catch语句
catch语句之后的这个模块
是用来捕获和处理异常的
在这里通常都要用到两个方法
一个是getMessage
这个方法返回一个字符串
字符串就包含了
对异常信息进行描述的内容
另外一个就是printStackTrace
这个分子是给出方法调用的序列
也就是调用站
那么finally语句
是不管在try代码段
是否产生了异常都要被执行的
通常我们在这里
释放内存以外的其他资源
那么需要注意的是
如果在try语句后面的块里面
有可能抛出多种类型的异常
那就需要在try之后
跟多个catch块
来捕获不类型的异常
那么这个时候一般就会
将更特殊的异常放在前面
将更一般的异常放在后面
也就是说如果我们
需要捕获的几个异常
其中有超类有子类的话
那我们应该首先
捕获子类类型的异常
后捕获超类类型的异常
好
我们知道了如何去捕获异常对象
并且处理异常
那么异常对象从哪儿来的呢
谁来产生异常对象呢
生成异常对象有三种方式
第一种方式就是
由Java虚拟机生成的
第二种是由Java类库里面的
某些类生成的
第三种就是在自己写的程序中
我们程序代码自己生成
和抛出异常对象
抛出异常对象都是
通过throw语句来实现的
这个被抛出的对象
必须是Throwable或者
其子类的实例
我们看这里给出两个例子
第一个例子我们在throw语句中
通过new操作构造一个异常对象去抛出
或者我们也可以
先构造一个异常对象
将它的引用
放在一个引用变量里面
然后throw这个引用变量
下面我们就来看一个
生成和抛出异常对象的例子
在这个例题中
我们主动来生成异常并且抛出
我们看在这几个try和catch块里边
我们都分别生成了
几种不同类型的异常
在try块里面生成异常
然后在catch块里面捕获这种异常
简单的处理一下
就是将异常对象的信息输出
这个就是模拟了什么
模拟了我们可以在程序逻辑中
判断当什么情况发生的时候
我们就认为这是
我们自己认为的某种异常
我们自己程序约定好这算异常
那我就抛出一个
我们约定类型的异常
也就说异常不见得都是
我们调用系统类库里面的方法
以后我们被动接收
被调用的方法抛出的异常
我们自己写的方法
也是可以主动生成异常的
就new一个异常对象
然后就抛出就可以了
我们看这是运行结果
在每个catch块中
我们输出了异常对象
里面包含的信息
也就是说这是个异常类的信息
使得用户知道发生了
什么类型的异常
除了使用系统预定的异常类以外
我们程序员写程序
还可以声明自己的异常类
我们在程序中自己声明的异常类
都必须是Exception类的子类
可以是直接的子类
也可以是间接的子类
这里给出了声明异常类的语法
我们看到这儿必须继承一个超类
这个超类可以本身
就是Exception类
或者是Exception的子类都可以
那么在自己声明的
这个异常类的构造方法中
第一句话应该是调用
它超类的构造方法
这个时候应该传一个字符串进去
那么这个字符串参数
应该是用来描述异常的信息的
也就是说到底发生了什么
要用这个字符串来描述
这一节我们学习了异常处理的机制
学习了try catch finally语句
以及怎么样声明自己的异常类
构造异常对象抛出异常对象
还有捕获和处理异常对象
好
这一节内容就是这些
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件