第三章 类中的方法
一、方法的控制流程
方法的控制流程
- Java程序通过控制语句来控制方法的执行流程
- Java中的流程控制结构主要有三种
- 顺序结构;选择结构(if语句,switch语句);循环结构(for,while,do-while语句)
1.if选择结构
以条件运算符代替if_else
2.switch选择结构
3.for循环结构
增强for循环
- Java 5的新特色
- 用来对数组或者集合对象进行遍历
- 语法格式如下:
for(Type name:Array/Set){//body of the loop;}
4.while循环结构
5.do-while循环结构
6.break语句
与标号一同使用时,将跳出标号所标识的循环
也可用在代码块中,用于跳出它所指定的块
7.continue语句
带标号的continue语句,使程序的流程直接转入标号标明的循环层次
当执行到满足条件i<j时,跳出inner循环,直接跳到outer循环,计算并修改i的值,进行下一轮的循环。
二、异常处理简介
异常处理
在进行程序设计时,要认识到错误的产生是不可避免的。所谓错误,是在程序运行过程中发生的异常事件,这些事件的发生将组织程序的正常运行
如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?
为了加强程序的鲁棒性,Java语言具有特定的运行错误处理机制
所谓“鲁棒性”,也是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。
1.异常处理的意义
异常的基本概念
- 又称为例外,是特殊的运行错误对象
- 是面向对象规范的一部分,是异常类的对象
- Java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了
- 该运行错误的信息;处理错误的方法
- 每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常
Java处理错误的方法
抛出(throw)异常
在方法的运行过程中,如果产生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常。
捕获(catch)异常
运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止。
异常处理示意图
Java异常处理机制的优点
- 将错误处理代码从常规代码中分离出来
- 按错误类型和差别分组
- 对无法预测的多雾的捕获和处理
- 克服了传统方法的错误信息有限的问题
- 把错误传播给调用堆栈
2.错误的概念
错误
- 程序运行过程中发生的异常事件
- 根据错误的严重程度不同,可分为两类
- 错误
- 致命性的,用户程序无法处理;Error类是所有错误类的父类
- 异常
- 非致命的,可编制程序捕获和处理;Exception类是所有异常类的父类
- 错误
再对异常进行分类
- 非检查型异常
- 不能期望程序捕获的异常(例如数组越界,除零等)
- 继承自RuntimeException
- 在方法中不需要声明,编译器也不进行检查
- 检查型异常
- 其它类型的异常
- 如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个父类),对此编译器要进行检查
异常和错误类的层次结构
预定义的一些常见异常

对于检查型异常,Java强迫程序必须进行处理。处理方法有两种:
- 声明抛出异常
- 不在当前方法内处理异常,而是把异常抛出到调用方法中
- 捕获异常
- 使用try{}catch(){}块,捕获到所发生的异常,并进行相应的处理
声明抛出异常
- 如果程序员不想在当前方法内处理异常,可以使用 throws子句声明将异常抛出到调用方法中
- 如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关的错误信息,并终止程序的运行。 在异常被抛出的过程中, 任何方法都可以捕获它并进行相应的处理
捕获异常
语法格式
try{statement(s)}catch(exceptiontypr name){statement(s)}finally{statement(s)}
说明
- try语句
- 其后跟随可能产生异常的代码块
- catch语句
- 其后跟随异常处理语句,通常用到两个方法
- getMessage() – 返回一个字符串对发生的异常进行描述。
- printStackTrace() – 给出方法的调用序列,一直到异常的产生位置
- finally语句
- 不论在try代码段是否发生异常,finally后的程序代码段都会被执行。通常在这里释放内存以外的其他资源
- 其后跟随异常处理语句,通常用到两个方法
注意事项
- 在类层次树中,一般的异常类型放在后面,特殊的放在前面
Review
4.生成异常对象
三种方式
- 由Java虚拟机生成
- 由Java类库中的某些类生成
- 在程序中生成自己的异常对象,也即是异常可以不是出错产生,而是人为地抛出
生成异常对象都是通过throw语句实现,生成的异常对象必须是Throwable或其子类的实例
5.声明自己的异常类
除使用系统预定义的异常类外,用户还可声明自己的异常类
自定义的所有异常类都必须是Exception的子类
如果使用者可以从该异常中恢复,则定义为检查型异常; 否则可以定义为非检查型异常(少)
一般的声明方法如下:
public class MyExceptionName extends SuperclassOfMyException {
public MyExceptionName() {
super("Some string explaining the exception");
}
}
三、方法的重载
方法签名
- 方法名和参数类型一起,构成方法签名(注意不包括返回值类型)
- 比如方法名声明为:
-
public double calculateAnswer(double wingSpan, int numberOfEngines, double length, double grossTons) { //do the calculation here }
-
- 则方法签名为:
-
calculateAnswer(double, int, double, double)
-
方法重载
- 一个类中名字相同的多个方法
- 这些方法的参数必须不同,Java可通过参数列表的不同来辨别重载的方法
- 或者参数个数不同
- 或者参数类型不同
- 返回值可以相同,也可以不同
- 重载的价值在于它允许通过使用一个方法名来访问多个方法
总之就是方法重载需要方法签名不同。
方法重载又叫做静态多态或者编译时多态
动态联编和静态联编
联编(绑定)就是把方法调用和方法体代码连接起来的过程。有两种形式的联编。
静态联编(又叫做早期联编):编译时根据变量类型和方法名称,决定被调方法的签名。
- Java的private,static,final方法都是静态联编。静态联编效率较高。
- 对于方法重载,首先是静态联编决定方法签名。
动态联编(又叫做晚期联编):编译时无法确定被调用的方法体,运行时根据对象类型决定。
- Java的方法覆盖就是动态联编最好的例子。
五、本章小结
本章内容
- Java程序中类方法的控制结构,包括顺序、分支及循环三种基本结构
- Java的异常处理机制,包括对错误的分类方法,如何抛出异常、捕获异常
- 方法的重载
本章要求
- 掌握三种流程控制语法,并熟练应用
- 了解Java的异常处理机制,会编写相应程序
- 掌握方法重载的含义,并熟练应用