第6章 内部类与异常类_第1页
第6章 内部类与异常类_第2页
第6章 内部类与异常类_第3页
第6章 内部类与异常类_第4页
第6章 内部类与异常类_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章内部类与异常类6.1内部类6.2匿名类6.3异常类6.4断言6.5Class类6.1内部类

Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。

内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。例子1classChina{finalStringsong="义勇军进行曲";privateBeijingbeijing;China(){beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}

classBeijing//内部类的声明{Stringname="北京";voidspeak(){System.out.println("我们是"+name+"我们的国歌是:"+getSong());}}}publicclassExample6_1{publicstaticvoidmain(Stringargs[]){Chinachina=newChina();china.getBeijing().speak();}}

6.2匿名类

6.2.1和类有关的匿名类

当使用类创建对象时,程序允许我们把类体与对象的创建组合在一起,也就是说,类创建对象时,除了构造方法还有类体,此类体被认为是该类的一个子类去掉类声明后的类体,称作匿名类。例如:

newPeople(){People类的子类的类体

}例子2abstractclassSpeak{publicabstractvoidspeakHello();}classStudent{voidf(Speaksp){sp.speakHello();}}publicclassExample6_2{publicstaticvoidmain(Stringargs[]){Studentst=newStudent();st.f(newSpeak(){publicvoidspeakHello(){System.out.println("Iamastudent,howareyou");}});

Speakspeak=newSpeak(){publicvoidspeakHello(){System.out.println("大家好,祝工作顺利!");}};speak.speakHello();//上转型对象speak调用匿名类重写的speakHello方法

}}6.2.2和接口有关的匿名类

Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了接口的类去掉类声明后的类体,称作匿名类。例如:

newComputable(){

使用了Computeable接口的类的类体

}例子3interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);//执行匿名类体中实现的getCubic方法

System.out.println(result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic()//使用匿名类创建对象,将该对象传递给方法f的参数cubic{publicdoublegetCubic(doublex){returnx*x*x;}});Cubiccu=newCubic()//使用匿名类创建对象,接口cu存放该对象的引用

{publicdoublegetCubic(doublex)//匿名类是实现Cubic接口的类

{returnx*x*x;//所以必须要实现getCubic方法

}};doublem=cu.getCubic(5);//接口回调

System.out.println(m);}}6.3异常类

所谓异常就是运行时可能出现一些错误,程序运行出现异常时,Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理,例如,读取一个不存在的文件时,运行环境就用异常类IOException创建一个对象,异常对象可以调用如下方法得到或输出有关异常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()Java的异常类是处理运行时错误的特殊类,每一种异常类对应一种特定的运行错误。Java中的每个异常都是Throwable类及其子类的实例对象,异常类的层次结构图如图6-1所示。

Throwable类分为java.lang.Exception类和java.lang.Error类,即错误和异常子类。

Error是指与虚拟机或动态装载等相关的问题,异常则是指一些可以被捕获且可以被恢复的错误。图6-1异常处理的类层次ObjectThrowableError…Exception…RuntimeExeption…

其中Error类由系统保留,而Exception类则供应用程序使用。

Exception类又分为两种:运行时异常和非运行时异常。

运行时异常(RuntimeException)是在Java运行系统执行过程中出现的异常。

非运行时异常(Non-RuntimeException)是由编译器检测到的,在程序运行过程中可能发生而要求必须处理的异常。系统定义的运行异常异常对应的系统运行错误ClassNotFoundException未找到欲装载使用的类FileNotFoundException未找到指定的文件或目录IOException输入、输出错误InterruptedException线程在睡眠、等待或因其他原因暂停时被其他线程打断UnknownHostException无法确定主机的IP地址SecurityException安全性错误,如Applet欲读写文件MalformedURLExceptionURL格式错误下表中列出了若干常见的系统定义异常6.3.1try~catch~finally语句

使用try~catch~finally语句来处理异常,将可能出现的异常操作放在try~catch~finally语句的try部分,当try部分中的某个语句发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分;所以程序可以将发生异常后的处理放在catch部分;finally部分表示try或catch执行完后,均需要执行的部分try~catch,表示为try~catch提供一个统一的“出口”。try~catch~finally语句可以出现多个catch,分别处理发生的相应异常。try{Java语句块}catch(异常错误类对象名){

异常处理语句块}finally{Java语句块}例:classExce{ publicstaticvoidmain(Stringargs[]) { inta,b,c,d; a=b=c=10; try{ d=a/(b-c); System.out.println("d="+d); }catch(ArithmeticExceptione){ System.out.println("除数不能为0");}finally{ d=1;System.out.println("d="+d);}}}例子4(效果如图所示)publicclassExample6_4{publicstaticvoidmain(Stringargs[]){intn=0,m=0,t=555;try{m=Integer.parseInt("8888");n=Integer.parseInt("abc789");t=9999;}catch(NumberFormatExceptione){System.out.println("发生异常:"+e.getMessage());e.printStackTrace();n=123;}System.out.println("n="+n+",m="+m+",t="+t);}}6.3.2自定义异常类在程序中也可以定义Exception类的子类作为自定义异常类,然后规定哪些方法产生这样的异常。这时就要用到throws和throw两个关键字。

throws包含在方法的声明中,其格式如下:返回类型方法名(参数)throws异常类名{

语句体}

其中,异常类名可以是多个,但需要用逗号隔开。此时,方法并不需要处理它所生成的异常,而是向上传递,由调用它的方法来处理这些异常。

异常的主动抛出由throw关键字完成。throw语句的格式为:

throwThrowableobject;

其中ThrowableObject必须为Throwable类或其子类的对象。例如:thrownewArithmeticExcption()例子5classIntegerExceptionextendsException{Stringmessage;IntegerException(intm){message="年龄"+m+"不合理";}publicStringtoString(){returnmessage;}}classPeople{privateintage=1;publicvoidsetAge(intage)throwsIntegerException{if(age>=160||age<=0)thrownewIntegerException(age);elsethis.age=age;}publicintgetAge(){System.out.println("年龄"+age+"合理");returnage;}}publicclassExample6_5{publicstaticvoidmain(Stringargs[]){Peoplewang=newPeople(),zhang=newPeople();try{wang.setAge(189);System.out.println(wang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}try{zhang.setAge(28);System.out.println(zhang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}}}

在使用异常的过程中,要遵循以下的四点原则:(1)不要过多地使用异常,更不要在循环体内使用异常。(2)在捕获或声明异常时,要选取合适类型的异常类。(3)一旦捕获了一个异常,就应对其做出相应的处理,而不应放任不管。(4)对于自定义的异常类,通常把它作为类Exception的子类,而不作为类Error的子类。并且在多数情况下,不要把自定义的异常类作为运行时异常类RuntimeException的子类。另外,自定义异常类的类名常常以Exception结尾。6.4断言

断言语句在调试代码阶段非常有用,断言语句一般用于程序不准备通过捕获异常来处理的错误。例如,当发生某个错误时,要求程序必须立即停止执行。使用关键字assert声明一条断言语句,断言语句有一下两种格式:

assertbooleanExpression;assertbooleanExpression:messageException;

其中booleanExpression必须是求值为boolean型的表达式;messageException可以是值为字符串的表达式。例子6importjava.util.Scanner;publicclassExample6_6{publicstaticvoidmain(Stringargs[]){System.out.println("请正数回车确认");Scannerscan=newScanner(System.in);doublenumber=scan.nextDouble();assertnumber>0:"负数不能计算平方根";System.out.println(number+"的平方根:"+Math.sqrt(number));}}6.5Class类6.5.1获取类的有关信息

Class是java.lang包中的类,该类的实例用来封装对象运行时的状态。当一个类被加载且创建对象时,和该类相关的一个类型为Calss的对象就会自动创建。

Class类本身不提供构造方法,因此,不能使用new运算符和构造方法显示地创建一个Class对象。

任何对象调用getClass()方法都可以获取和该对象相关的一个Class对象,这个Class对象调用如下的方法可以获取创建对象的类的有关信息:

publicStringgetName()publicConstructor[]getDeclaredConstructors()publicField[]getDeclareFields()publicMethod[]getDeclaredMethods()例子7importjava.lang.reflect.*;classRect{doublewidth,height,area;publicdoublegetArea(){area=height*width;returnarea;}}publicclassExample6_7{publicstaticvoidmain(Stringargs[]){Rectrect=newRect();Classcs=rect.getClass(); StringclassName=cs.getName();Constructor[]con=cs.getDeclaredConstructors();Field[]field=cs.getDeclaredFields();Method[]method=cs.getDeclaredMethods();System.out.println("类的名字:"+className);System.out.println("类中有如下的成员变量:");for(inti=0;i<field.length;i++){System.out.println(field[i].toString());}System.out.println("类中有如下的方法:");for(inti=0;i<method.length;i++){System.out.println(method[i].toString());}System.out.println("类中有如下的构造方法:");for(inti=0;i<con.length;i++){System.out.println(con[i].toString());}}}6.5.2使用Class实例化一个对象

创建对象最常用的方式就是使用new运算符和类的构造方法,实际上我们也可以使用Class对象得到一个类的实例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论