当前位置:文档之家› 第08章 内部类与异常

第08章 内部类与异常

第8章 内部类与异常类
8.1 内部类
在java中有时候会需要只定义了一两个方法的类或者
接口,该类也只被某一个类调用(实现)。 此时,我们可以使用内部类。
内部类:在一个类中定义的另一个类
外嵌类:包含内部类的类称为内部类的外嵌类。 外嵌类的成员变量在内部类中仍然有效,内部类中的
方法也可以调用外嵌类中的方法。
表明try部分可能发生的异常,这些子类乊间不能有父子 关系,否则保留一个含有父类参数的catch即可。
8.3.2 自定义异常类
通过扩展Exception类定义自己的异常类,然后根据
程序的需要来规定哪些方法产生这样的异常。
一个方法在声明时可以使用throws关键字声明要产生
的若干个异常,并在该方法的方法体中具体给出产生 异常的操作,即用相应的异常类创建对象,并使用 throw关键字抛出该异常对象,导致该方法结束执行。
8.3.1 try~catch语句
Java使用try~catch语句来处理异常 将可能出现的异常操作放在try~catch语句的try 部分 将发生异常后的处理放在catch部分
当try部分中的某个方法调用发生异常后,try部分
将立刻结束执行,而转向执行相应的catch部分
try~catch语句可以由几个catch组成,分别处理
内部类还可以定义在方法体内 public class Hapiness{
interface Smiler{ public void smile(); }
public static void main(String[] args){ class Happy implements Smiler{ public void smile(){ System.out.println(":-}"); } }
其中booleanExpression必须是求值为boolean型的表
达式;messageException可以是求值为字符串的表达 式。
8.4断言
assert booleanExpression;
booleanExpression=false,程序从断言语句处停止执行
booleanExpression=true,程序从断言语句处继续执行。
如果方法的传递参数是一个接口,此时可以利用匿名
类作为参数传递给该方法。 例如
Void f(Computable x)//参数x的类型为接口
在调用f方法时,可以传递一个匿名类给参数x:
f(new Computable (){……})
示例8-3演示了接口有关的匿名类的用法
注意
单纯的嵌套类一般不建议使用!但它在java核心类中
8.2.1与子类有关的匿名类
如果没有显示声明一个类的子类,却又想用这个子
类来创建对象,该怎么办?
Java中可以直接用一个类的类体来创建一个子类
对象
该类体被认为是一个子类去掉类声明以后的类体,
称为一个匿名类
8.2.1与子类有关的匿名类
匿名类就是一个子类,由于无名可用,所以不可能用
匿名类声明对象,但却可以直接用匿名类创建一个对 象 例如:Bank是类,则以下代码就是用Bank的一个子 类(匿名类)创建对象
程序必须在try~catch块语句中调用能发生异常的方法,
其中catch的作用就是捕获throw方法抛出的异常对象
8.4断言
断言语句在调试代码阶段非常有用,断言语句一般用
于程序不准备通过捕获异常来处理的错误 使用关键字assert声明一条断言语句,断言语句有以 下两种栺式: assert booleanExpression; assert booleanExpression:messageException;
发生的相应异常
8.3.1 try~catch语句
try~catch语句的栺式如下:
try { 包含可能发生异常的语句 } catch(ExceptionSubClass1 e) { …} catch(ExceptionSubClass2 e) { …}
各个catch参数中的异常类都是Exception的某个子类,
都存在,如接口Map中的Entry,我们应该了解并能解读 这种方法.
匿名类相对而言有用得多,在解耦合和事件回调注册中
很常见,大家应该对它的运用融会贯通.
用得好都是优点,用得不好都是缺点。
8.3 异常类
所谓异常就是程序运行时可能出现一些错误
Java的异常出现在方法调用过程中,即在方法调用过
New Bank() { 匿名类的类体; } Class 匿名类 extends Bank {定义}
匿名类对象 a= new 匿名类()
8.2.1与子类有关的匿名类
匿名类可以继承父类的方法也可以重写父类的方法

使用匿名类时,必然是在某个类中直接用匿名类创建对
象,因此匿名类一定是内部类,匿名类可以访问外嵌类 中的成员变量和方法
程中抛出异常对象,终止当前方法的继续执行,同时 导致程序运行出现异常,并等待处理 例如,流对象在调用read方法读取不存在的文件时, 会抛出异常对象:IOException,该对象可以通过调 用以下方法得到或输出有关异常信息
Public String getMessage(); Public void printStackTrace(); Public String toString();
的实例名.
8.2 匿名类
// 定义类 Public class Runner implements Runnable{ public void run(){ // do sth } }
// 创建实例 Runner runner=new Runner();
Runnable runner=new Runnable(){ public void run(){ // Run statememnt } }
assert booleanExpression:messageException;
booleanExpression=false,程序从断言语句处停止执行,
并输出messageException表达式的值,提示用户出现了 怎样的问题;
若看不到错误信息,可能是因为java的编译器关闭了断
言语句,可以用 java -ea Example8_6 来启用断言语 句
匿名类的类体中不可以声明static成员变量和static方法
8.2.1与子类有关的匿名类
由于匿名类是一个子类,但没有类名,所以在用匿名类
创建对象时,要直接使用父类的构造方法
尽管匿名类创建的对象没有经过类声明步骤,但匿名对
象的引用可以传递给一个匹配的参数,匿名类的常用的 方式是向方法的参数传值。
8.2.2 和接口有关的匿名类
假设Computable是一个接口,Java允许直接用接口名
和一个类体创建一个匿名对象,此类体被认为是实现了 Computable接口的类去掉类声明后的类体,称作与接 口有关的匿名类。如:
new Computable() { 实现接口的匿名类的类体 };
8.2.2 和接口有关的匿名类
Happy happy=new Happy(); happy.smile(); }
}
8.2 匿名类
有时候,内部类声明只为在类里面用它来创建一个对
象(只用一次),因而,对很多情况而言,这个类有 没有名字,或名字叫什么无关紧要。
可有可无的东西,干脆不要!
为了简洁开发,类名使用匿名,程序员关心的只是它
8.1 内部类
内部类的类体中不可以声明类变量和类方法。外嵌类的
类体中可以用内部类声明对象,作为外嵌类的成员。 内部类仅供它的外嵌类使用,其他类不可以用某个类的 内部类声明对象 例如:某种类型的农场饲养了一种牛,但不希望其他农 场饲养,则,可以将这种牛作为该农场的内部类。(例 8-1)
8.1 内部类
相关主题