第六章 内部类与异常类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.2 匿名类
当使用类创建对象时,程序允许把类体与对象的创建 组合在一起,也就是说,类创建对象时,除了构造方 法还有类体,此类体被认为是该类的一个子类去掉类 声明后的类体,称匿名类。 匿名类就是一个子类,由于无名可用,所以不能用匿 名类声明对象,但却可以直接用匿名类创建一个对象
例如:假设People是类,那么下列代码就是用People的一个子类 (匿名类)创建对象 new People() { 匿名类的类体 }
和接口有关的匿名类
如果某个方法的参数是接口类型,那么 可以使用接口名和类体组合创建一个匿 名对象传递给方法的参数,类体必须要 实现接口中的全部方法
例子
interface Cubic { double getCubic(int n); } interface Sqrt { public double getSqrt(int x); } class A { void f(Cubic cubic) { double result=cubic.getCubic(3); System.out.println(result); } } public class Example4_32 { public static void main(String args[]) { A a=new A(); a.f ( new Cubic() { public double getCubic(int n) { return n*n*n; } } ); Sqrt ss=new Sqrt() { public double getSqrt(int x) { return Math.sqrt(x); } }; double m=ss.getSqrt(5); System.out.println(m); } }
6.3 异常类
所谓异常就是程序运行时可能出现的一些错误,比如说: ① 用户输入出错 ② 所需文件找不到 ③ 运行时磁盘空间不够 ④ 内存不够 ⑤ 算术运算错 (数的溢出,被零除…) ⑥ 数组下标越界 …… 当Java程序出现以上的错误时,就会在所处的方法中产生一个异 常对象。这个异常对象包括错误的类型,错误出现时程序的运行 状态以及对该错误的详细描述。并由系统中相应的机制来处理, 以确保不会产生死机、死循环或其他对操作系统有损害的结果, 从而保证了整个程序运行的安全性。
例子
class China { final String nationalAnthem="义勇军进行曲"; Beijing beijing; China() { beijing=new Beijing(); } String getSong() { return nationalAnthem; } class Beijing //内部类 { String name="北京"; void speak() { System.out.println("我们是"+name+" 我们的国歌是:"+getSong()); } } } public class Example4_30 { public static void main(String args[]) { China china=new China(); china.beijing.speak(); } }
Exception类 Error类 Error子类
RuntimeException类 RuntimeException子类
CheckedException类 CheckedException子类
异常类的继承结构
异常类的继承关系
Java中所有的异常类都继承自 java.lang.Throwable类。Throwable类有两个 直接子类:
例子
class Cubic { double getCubic(int n) { return 0; } } abstract class Sqrt { public abstract double getSqrt(int x); } class A { void f(Cubic cubic) { double result=cubic.getCubic(3); // 执行匿名类体中重写的getCubic System.out.println(result); } } public class Example4_31 { public static void main(String args[]) { A a=new A(); a.f ( new Cubic() //使用匿名类创建对象,将该对象传递给方法f的参数cubic { double getCubic(int n) { return n*n*n; } } ); Sqrt ss=new Sqrt() { public double getSqrt(int x) { return Math.sqrt(x); } }; double m=ss.getSqrt(5); System.out.println(m); } }
try-catch语句的说明
(1) try:将可能出现错误的程序代码放在try块中,对try 块中的程序代码进行检查,可能会抛出一个或多个异 常。因此,try后面可跟一个或多个catch。 (2) catch:其功能是捕获异常,参数ExceptionObject是 ExceptionType类的对象,这是由前面的try语句生成的。 ExceptionType是Throwable类中的子类,它指出catch 语句中所处理的异常类型。catch捕获异常的过程中, 要将Throwable类中的异常类型和try语句抛出的异常 类型进行比较,若相同,则在catch中进行处理。 (3) Finally:是这个组合语句的统一出口,一般用来进行 一些“善后”操作,例如释放资源、关闭文件等。它 是可选的部分。
程序运行时期
是否自行处理异常
使用try-catch-finally语句自行 处理
由预设处理方法加以 处理
Java异常处理机制结构
Java异常处理机制
在Java程序中,当程序运行过程中发生异常时,可采用如图所示 的两种方式处理异常: 一是由Java异常处理机制的预设处理方法来处理,即一旦程序发
生异常,程序就会被终止并显示一些错误信息给用户; 二是使用Java语言提供的try-catch-finally语句自行处理异常。这
种方式的优点很多,其中最主要的优点是将处理异常的代码与程 序代码的主线分离开来,增强了程序的可读性;其次是可减少中 途终止程序运行的可能性。
异常类的继承关系
Object类 Throwable类
匿名类可以继承父类的方法,也可以重写父类 的方法 匿名类一定是内部类,可以访问外嵌类中的成 员变量和方法 匿名类的类体中不能声明static成员变量和 static方法 匿名对象的引用必须传递给一个匹配的参数, 匿名类的主要用途就是向方法的参数传值
假设f(B x)是一个方法: void f(B x) { x调用B类中的方法 } 其中参数是B类对象,那么在调用方法f时可以向其参 数x传递一个匿名对象,例如 f ( new B() { 匿名类的类体 } ) 如果匿名类继承了父类的方法,x就调用继承的方法 如果匿名类重写了父类的方法,x就调用重写的方法
【示例程序c11_2.java】 使用try-catch-finally语句自行处理异常
public class c11_2 { public static void main(String args[ ]) { int a,b,c; a=67; b=0; try { int x[ ]=new int[-5]; c=a/b; System.out.println(a+"/"+b+"="+c); } catch(NegativeArraySizeException e) { System.out.println("exception: " + e.getMessage( )); e.printStackTrace( ); } catch(ArithmeticException e) { System.out.println("b=0: " + e.getMessage( )); } finally { System.out.println("end"); } } }
一个是Exception类,它包含了一般性的异常,如 I/O异常,SQL异常,这些异常是用户可以捕捉到 的异常,可以通过产生它的子类来创建自己的异 常处理。(try-catch语句) 一个是Error子类,它包含Java系统或执行环境中 发生的异常,这些异常是用户无法捕捉到的异常
6.3.1 try-catch语句
try-catch语句构成Java对异常直接处理的基本处理单元,其 一般语法如下: try { 包含可能发生异常的语句} catch (ExceptionClass1 c) { 处理异常的代码 } catch (ExceptionClass2 d) { 处理异常的代码 } finally { 无论是否发生异常都要执行的程序代码 } 各个catch参数中的异常类都是Exception的某个子类,表明 try部分可能发生的异常,这些子类之间不能有父子关系, 否则保留一个含有父类参数的catch即可
嵌套try-catch-finally语句
Java语言的try-catch-finally语句可以嵌套,即
在try块中可以包含另外的try-catch-finally语句。
【示例程序c11_3.java】 使用嵌套的try-catch-finally语句自行处理异常。
public class c11_3 { static int a,b,c; public static void main(String args[ ]) { try { a=10; b=0; try { c=a/b; System.out.println("a/b = " + c); } catch (IndexOutOfBoundsException E) { System.out.println("捕捉超出索引异常 ..."); } finally { System.out.println("嵌套内层的 finally区块 "); } } catch(ArithmeticException E) { System.out.println("捕捉数学运算异常: b="+b); } finally { System.out.println("嵌套外层的 finally区块 "); if(b == 0) System.out.println("程序执行发生异常 !"); else System.out.println("程序正常执行完毕 !"); } } }
try-catch-finally结构
无异常
try 执行catch
有异常
执行finally
try-catch-finally结构
Baidu Nhomakorabea 例子
public class Example4_33 { public static void main(String args[ ]) { int n=0,m=0,t=555; try{ m=Integer.parseInt("8888"); n=Integer.parseInt(“abc789”); t=9999; } catch(NumberFormatException e) { System.out.println("发生异常:"+e.getMessage()); e.printStackTrace(); n=123; } System.out.println("n="+n+",m="+m+",t="+t); } }
第六章 内部类与异常类
6.1 内部类
类可以有两种重要的成员:成员变量和方法,类还可 以有一种成员:内部类。 Java 支持在一个类中声明另一个类,这样的类称为内 部类,而包含内部类的类成为外嵌类。 声明内部类与在类中声明方法或成员变量一样,一个 类把内部类看作是自己的成员 内部类的外嵌类的成员变量在内部类中仍然有效,内 部类中的方法也可以调用外嵌类中的方法 内部类的类体中不能声明类变量和方法。 外嵌类的类体中可以用内部类声明对象,作为外嵌类 的成员