第8章内部类与异常

上传人:仙*** 文档编号:71315800 上传时间:2022-04-06 格式:PPT 页数:49 大小:1.35MB
返回 下载 相关 举报
第8章内部类与异常_第1页
第1页 / 共49页
第8章内部类与异常_第2页
第2页 / 共49页
第8章内部类与异常_第3页
第3页 / 共49页
点击查看更多>>
资源描述
JavaJava支持在一个类中声明另一个类,这样的类称作支持在一个类中声明另一个类,这样的类称作内部类内部类,而包含内部类的类称为内部类的,而包含内部类的类称为内部类的外嵌类外嵌类。内部类的外嵌类的成员变量在内部类中仍然有效,内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法内部类的类体中不可以声明类变量和类方法。外嵌。外嵌类的类体中可以用内部类声明对象,作为外嵌类的类的类体中可以用内部类声明对象,作为外嵌类的成员。成员。内部类仅供它的外嵌类使用内部类仅供它的外嵌类使用,其他类不可以用某个其他类不可以用某个类的内部类声明对象。类的内部类声明对象。另外,由于内部类的外嵌类的成员变量在内部类中另外,由于内部类的外嵌类的成员变量在内部类中仍然有效,使得内部类和外嵌类的交互更加方便。仍然有效,使得内部类和外嵌类的交互更加方便。例例8-18-1public class RedCowForm public class RedCowForm String formName; String formName; RedCow cow; / RedCow cow; /内部类声明对象内部类声明对象 RedCowForm() RedCowForm() RedCowForm(String s) RedCowForm(String s) cow = new RedCow(150,112,5000); cow = new RedCow(150,112,5000); formName=s; formName=s; public void showCowMess() public void showCowMess() cow.speak(); cow.speak(); class RedCow / class RedCow /内部类的声明内部类的声明 String cowName=String cowName=红牛红牛; ; int height,weight,price; int height,weight,price; RedCow(int h,int w,int p) RedCow(int h,int w,int p) height=h; height=h; weight=w; weight=w; price=p; price=p; void speak() void speak() System.out.println( System.out.println(偶是偶是+cowName+,+cowName+,身高身高:+height+:+height+cm cm 体重体重:+weight+kg,:+weight+kg,生活在生活在+formName);+formName); public class Example8_1 public class Example8_1 public static void main(String args) public static void main(String args) RedCowForm form = new RedCowForm( RedCowForm form = new RedCowForm(红牛农场红牛农场);); form.showCowMess(); form.showCowMess(); 8.2.1 8.2.1 和子类有关的匿名类和子类有关的匿名类创建子类对象时,除了使用父类的构造方法外还有创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类类体,此类体被认为是一个子类去掉类声明后的类体,称作体,称作匿名类匿名类。匿名类就是匿名类就是一个子类一个子类,由于,由于无名可用无名可用,所以,所以不可能不可能用匿名类声明对象用匿名类声明对象,但,但却可以直接用匿名类创建一却可以直接用匿名类创建一个对象。个对象。匿名类例子匿名类例子newnew Bank(Bank( ) ) 匿名类类体匿名类类体 ;假设假设BankBank是类,那么上面代码就是用是类,那么上面代码就是用BankBank的一个的一个子类(匿名)类创建的对象。子类(匿名)类创建的对象。由于匿名类是一个子类,但没有类名,所以在用匿名由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,类创建对象时,要直接使用父类的构造方法要直接使用父类的构造方法。尽管匿名类创建的对象没有经过类声明步骤,但匿名尽管匿名类创建的对象没有经过类声明步骤,但匿名对象的引用可以传递给一个匹配的参数,对象的引用可以传递给一个匹配的参数,匿名类的常匿名类的常用的方式是向方法的参数传值用的方式是向方法的参数传值。匿名类匿名类可以可以继承父类的方法继承父类的方法也可以也可以重写父类的方法重写父类的方法。使用匿名类时,必然是在某个类中直接用匿名类创建使用匿名类时,必然是在某个类中直接用匿名类创建对象,对象,因此匿名类一定是内部类因此匿名类一定是内部类,匿名类可以访问外,匿名类可以访问外嵌类中的成员变量和方法,嵌类中的成员变量和方法,匿名类的类体中不可以声匿名类的类体中不可以声明明staticstatic成员变量和成员变量和staticstatic方法方法例例8-28-2ShowBoardShowBoard类的类的showMess(InputAlphabet show)showMess(InputAlphabet show)方法的参数是方法的参数是InputAlphabetInputAlphabet类型的对象,用户在编类型的对象,用户在编写程序时,希望使用写程序时,希望使用ShowBoardShowBoard类的对象调用类的对象调用showMess(InputAlphabet show)showMess(InputAlphabet show)输出英文字母表和输出英文字母表和希腊字母表,但系统没有提供输出希腊字母表的子类,希腊字母表,但系统没有提供输出希腊字母表的子类,因此用户可以使用匿名类来实现因此用户可以使用匿名类来实现abstractabstract class class InputAlphabetInputAlphabet public abstract void input(); public abstract void input(); public class public class InputEnglishInputEnglish extendsextends InputAlphabetInputAlphabet public void input() public void input() for(char c=a;c=z;c+) for(char c=a;c=z;c+) System.out.printf(%3c,c); System.out.printf(%3c,c); public class public class ShowBoardShowBoard void showMess(InputAlphabet show) void showMess(InputAlphabet show) show.input(); show.input(); public class Example8_2 public class Example8_2 public static void main(String args) public static void main(String args) ShowBoard board=new ShowBoard(); ShowBoard board=new ShowBoard(); board.showMess(new InputEnglish(); / board.showMess(new InputEnglish(); /向参数传递向参数传递InputAlphabetInputAlphabet的子类对象的子类对象 board.showMess(new InputAlphabet() /board.showMess(new InputAlphabet() /向参数传递向参数传递InputAlphabetInputAlphabet的匿名子类对象的匿名子类对象 public void input() public void input() for(char c=;c=;c+) / for(char c=;c=;c+) /输出希腊字输出希腊字母母 System.out.printf(%3c,c); System.out.printf(%3c,c); ); ); 假设假设ComputableComputable是一个接口,那么,是一个接口,那么,JavaJava允许直接用接允许直接用接口名和一个类体创建一个匿名对象口名和一个类体创建一个匿名对象,此类体被认为是实,此类体被认为是实现了现了ComputableComputable接口的类去掉类声明后的类体,称作匿接口的类去掉类声明后的类体,称作匿名类。下列代码就是用实现了名类。下列代码就是用实现了ComputableComputable接口的类(匿接口的类(匿名类)创建对象:名类)创建对象:new Computable() new Computable() 实现接口的匿名类的类体实现接口的匿名类的类体; ;如果某个方法的参数是接口类型,那么可以使用接口名如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,和类体组合创建一个匿名对象传递给方法的参数,类体类体必须要重写接口中的全部方法必须要重写接口中的全部方法例例8-38-3interface SpeakHello interface SpeakHello void speak(); void speak(); class HelloMachine class HelloMachine public void turnOn(SpeakHello hello) public void turnOn(SpeakHello hello) hello.speak(); hello.speak(); public class Example8_3 public class Example8_3 public static void main(String args) public static void main(String args) HelloMachine machine = new HelloMachine(); HelloMachine machine = new HelloMachine(); machine.turnOn( new SpeakHello() machine.turnOn( new SpeakHello() public void speak() public void speak() System.out.println(hello,you are welcome!); System.out.println(hello,you are welcome!); ); ); machine.turnOn( new SpeakHello() machine.turnOn( new SpeakHello() public void speak() public void speak() System.out.println( System.out.println(你好,欢迎光临你好,欢迎光临!);!); ); ); 所谓异常就是所谓异常就是程序运行时程序运行时可能出现一些错误可能出现一些错误JavaJava的异常出现在方法调用过程中,即在方法调用的异常出现在方法调用过程中,即在方法调用过程中抛出异常对象,终止当前方法的继续执行,过程中抛出异常对象,终止当前方法的继续执行,同时导致程序运行出现异常,并等待处理同时导致程序运行出现异常,并等待处理JavaJava中常见异常中常见异常RuntimeExceptionRuntimeException: :一些特殊的异常,比如被一些特殊的异常,比如被0 0除,数除,数组下标越界等,组下标越界等,处理比较麻烦处理比较麻烦。而且对程序的可读性。而且对程序的可读性以及运行效率影响很大,以及运行效率影响很大,因此由系统自动检测并将它因此由系统自动检测并将它们交给缺省的异常处理程序们交给缺省的异常处理程序(用户可不必对其处理用户可不必对其处理) ArithmeticExceptionArithmeticException:数学计算异常:数学计算异常 ArrayStoreExceptionArrayStoreException:数组存储异常:数组存储异常 NegativeArraySizeExceptionNegativeArraySizeException:负数组长度异常:负数组长度异常 ArrayOutOfBoundsExceptionArrayOutOfBoundsException:数组索引越界异常:数组索引越界异常 NullPointExceptionNullPointException:空指针异常:空指针异常IOException(IOException(用户必须对其处理!用户必须对其处理!) ) FileNotFoundExceptionFileNotFoundException:文件未找到异常:文件未找到异常 EOFExceptionEOFException:读写文件尾异常:读写文件尾异常 MalformedURLExceptionMalformedURLException:URLURL格式错误异常格式错误异常 SocketExceptionSocketException:SocketSocket异常异常JavaJava中处理异常中处理异常Java处理异常是用5个关键字实现的 try catch finally throw throws 捕获异常捕获异常 catchtryfinally执行可能产生执行可能产生 异常的代码异常的代码 捕获异常捕获异常 无论是否发生异常,无论是否发生异常,代码总能执行代码总能执行手动抛出异常手动抛出异常 抛出异常抛出异常 throw声明异常声明异常 声明方法可能要声明方法可能要抛出的各种异常抛出的各种异常 throws 异常处理方式异常处理方式两种处理方式:两种处理方式:(1 1)使用)使用trytrycatchcatchfinallyfinally结构对异常结构对异常进行捕获和处理进行捕获和处理(2 2)通过)通过throwsthrows和和throwthrow抛出异常抛出异常trytrycatchcatchfinallyfinally结构结构trytry / / 可能会抛出特定异常的代码段可能会抛出特定异常的代码段 catchcatch( (异常类型异常类型1 1 引用引用1)1)/ / 如果引用如果引用1 1 被抛出,则执行这段代码被抛出,则执行这段代码 catchcatch( (异常类型异常类型2 2 引用引用2)2)/如果另外的异常引用如果另外的异常引用2 2被抛出,则执行这段代码被抛出,则执行这段代码 finallyfinally /无条件执行的语句无条件执行的语句 各个各个catchcatch参数中的异常类都是参数中的异常类都是ExceptionException的某个子类的某个子类,表明,表明trytry部分可能发生的异常,部分可能发生的异常,这些子类之间不能有父子关系这些子类之间不能有父子关系,否则保否则保留一个含有父类参数的留一个含有父类参数的catchcatch即可即可说明说明(1) try(1) try将可能出现异常的代码都放在将可能出现异常的代码都放在trytry代码代码块中块中(2) catch- (2) catch- 如果如果trytry内出现了异常,系统将终止内出现了异常,系统将终止trytry块代码的执行,自动跳转到所发生的异常类块代码的执行,自动跳转到所发生的异常类对应的对应的catchcatch块中。执行该块中代码块中。执行该块中代码(3) finally(3) finally是可选项,无论异常是否发生,该是可选项,无论异常是否发生,该块都执行。一般用来块都执行。一般用来善后处理善后处理说明说明(4 4) catchcatch与与finallyfinally不能同时省略不能同时省略(5 5)try.catchtry.catch以及以及finallyfinally语句块之间不能插入任语句块之间不能插入任何代码何代码例例1 1:捕获数组下标越界异常:捕获数组下标越界异常public class Exception1 public static void main(String args ) try int a = 1, 2, 3, 4, 5 , sum = 0;for (int i = 0; i = 5; i+)sum = sum + ai;System.out.println(sum= + sum);System.out.println(Successfully! ); catch (ArrayIndexOutOfBoundsException e) System.out.println(ArrayIndexOutOfBoundsException detected); finally System.out.println( Programm Finished! ); 例例2 2 :捕获算术异常:捕获算术异常public class Exception2 public class Exception2 public static void main(String args) public static void main(String args) trytry int x, y;int x, y;x = 15;x = 15;y = 0;y = 0;System.out.println(x / y);System.out.println(x / y);System.out.println(Computing successfully!);System.out.println(Computing successfully!); catchcatch ( (ArithmeticExceptionArithmeticException e) e) System.out.println( ArithmeticException System.out.println( ArithmeticException catched catched !);); finallyfinally System.out.println(Finally block!);System.out.println(Finally block!); 异常的传播过程异常的传播过程如果没有如果没有catchcatch语句块捕获异常,异常将沿着方法语句块捕获异常,异常将沿着方法的调用栈一直向上传播。如果传播的过程一直没有的调用栈一直向上传播。如果传播的过程一直没有catchcatch语句块捕获,则最终传播到语句块捕获,则最终传播到mainmain方法方法,最后,最后从从mainmain方法抛出,有方法抛出,有JREJRE来处理来处理public class Testpublic class Test public static void main(String args)public static void main(String args)/在主方法中调用在主方法中调用method1method1 method1(); method1(); static void method1()static void method1()/在在method1method1中调用中调用method2method2方法方法method2();method2(); static void method2()static void method2() int a=new int3;int a=new int3;a4=12;/a4=12;/产生下标越界异常产生下标越界异常System.out.println(ok!);System.out.println(ok!); 异常的分类异常的分类异常可分为:异常可分为:可控异常可控异常和和执行时异常执行时异常可控异常:可控异常: 即使程序本身没有问题,在某些情况下也可能发生即使程序本身没有问题,在某些情况下也可能发生 比如:使用输入输出功能时,可能会由于硬件问题,比如:使用输入输出功能时,可能会由于硬件问题,使得程序无法正常从硬件取得输入或输出,这种错误使得程序无法正常从硬件取得输入或输出,这种错误是可以预期发生的。像这类异常称之为是可以预期发生的。像这类异常称之为可控异常可控异常注意:注意:JavaJava规定:对于可控异常,编译器要求您必须进规定:对于可控异常,编译器要求您必须进行处理!行处理!补补充充例例题题import java.io.import java.io.* *; ;public class Testpublic class Testpublic static void main(String args)public static void main(String args) trytry BufferedReader buf=new BufferedReader buf=new BufferedReader(new InputStreamReader(System.in);BufferedReader(new InputStreamReader(System.in);System.out.println(System.out.println(请输入整数请输入整数););int input=Integer.parseInt(buf.readLine();int input=Integer.parseInt(buf.readLine();System.out.println(input =+input);System.out.println(input =+input); catch(IOException e)catch(IOException e) System.out.println(I/O System.out.println(I/O异常异常);); catch(NumberFormatException e)catch(NumberFormatException e) System.out.println( System.out.println(输入必须为整数输入必须为整数);); 说明说明IOExceptionIOException是可控异常,是可预期会发生的异常。是可控异常,是可预期会发生的异常。编编译器要求您必须处理!译器要求您必须处理!注意:异常一旦丢出就不会回到原点注意:异常一旦丢出就不会回到原点NumberFormatExceptionNumberFormatException是执行时异常。是执行时异常。所谓的执行时异常就是发生在程序执行期间,并不一定所谓的执行时异常就是发生在程序执行期间,并不一定可预测它的发生。可预测它的发生。且编译器不要求您一定要处理执行时且编译器不要求您一定要处理执行时异常。异常。对于执行时异常若没有处理,则异常会一直往外丢,最对于执行时异常若没有处理,则异常会一直往外丢,最后由后由JVMJVM来处理来处理抛出异常抛出异常1 1 抛出异常语句抛出异常语句2 2 抛出异常选项:抛出异常选项:throwsthrows什么叫异常的抛出什么叫异常的抛出如果某个方法里面有异常,并且没有被捕获,那么其如果某个方法里面有异常,并且没有被捕获,那么其会一层一层上报给调用者。会一层一层上报给调用者。public class Testpublic class Test public static void main(String args)public static void main(String args) a(); a(); System.out.println( System.out.println(恭喜你,调用方法成功!恭喜你,调用方法成功!);); static void a()static void a() trytry b();b(); catch(RuntimeException re)catch(RuntimeException re) System.out.println(System.out.println(异常在异常在a a方法被解决掉!方法被解决掉!);); static void b()static void b() c();c(); static void c()static void c() int a=new int3;int a=new int3;a4=12;a4=12; 小小例例题题1 1 抛出异常语句抛出异常语句程序员可以自己通过程序员可以自己通过throwthrow语句抛出异常。语句抛出异常。throwthrow语句的格式如下语句的格式如下: : throw new throw new 异常类名(信息)异常类名(信息) 异常类名可以是系统异常类名,也可以是自定义的异异常类名可以是系统异常类名,也可以是自定义的异常类名常类名 “信息信息”是可选信息。若提供了信息,是可选信息。若提供了信息,toString()toString()方方法的返回值中将增加该信息的内容法的返回值中将增加该信息的内容例例3 3public class Exception3 public class Exception3 public static int Sum(int n) public static int Sum(int n) if (n 0)if (n 0)throwthrow new new IllegalArgumentExceptionIllegalArgumentException(n(n应该为正整数!应该为正整数!););int s = 0;int s = 0;for (int i = 0; i = n; i+)for (int i = 0; i = n; i+)s = s + i;s = s + i;return s;return s; public static void main(String args) public static void main(String args) try try int n = Integer.parseInt(args0);int n = Integer.parseInt(args0);System.out.println(Sum(n);System.out.println(Sum(n); catch (ArrayIndexOutOfBoundsException e) catch (ArrayIndexOutOfBoundsException e) System.out.println(System.out.println(命令行为:命令行为: + java Exception3 + java Exception3 );); catch (NumberFormatException e2) catch (NumberFormatException e2) System.out.println(System.out.println(参数参数应为整数应为整数!);!); catch (IllegalArgumentException e3) catch (IllegalArgumentException e3) System.out.println(System.out.println(错误参数错误参数: + e3.toString();: + e3.toString(); finally finally System.out.println(System.out.println(程序结束程序结束!);!); 2 2 抛出异常选项抛出异常选项为了明确指出一个方法不捕获某类异常为了明确指出一个方法不捕获某类异常,而让调用该方而让调用该方法的其他方法捕获该类异常法的其他方法捕获该类异常,可以在声名方法的时候,可以在声名方法的时候,使用使用throwsthrows可选项,抛出该类异常。可选项,抛出该类异常。格式如下:格式如下: 修饰符修饰符 返回值类型名返回值类型名 方法名方法名 参数表参数表 throwsthrows 异常类型异常类型名名 方法体方法体 例例4 4抛出异常方法抛出异常方法public class Exception4 public class Exception4 public static int Sum() public static int Sum() throwsthrows NegativeArraySizeException NegativeArraySizeException int s = 0;int s = 0;int x = new int-4;int x = new int-4;for (int i = 0; i 4; i+) for (int i = 0; i 1.0E8 | aim1.0E8 | aim0) throw new OverFlowException(); throw new OverFlowException(); else else return x return x* *x;x; public static void main(String args ) public static void main(String args ) int y; int y; try try y= multi(); y= multi(); System.out.println(y=+y); System.out.println(y=+y); catch(OverFlowException e) catch(OverFlowException e) System.out.println(e); System.out.println(e); 一个方法在声明时可以使用一个方法在声明时可以使用throwsthrows关键字关键字声明要产声明要产生的若干个异常,并在该方法的方法体中具体给出生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并产生异常的操作,即用相应的异常类创建对象,并使用使用throwthrow关键字抛出该异常对象,导致该方法结关键字抛出该异常对象,导致该方法结束执行。程序必须在束执行。程序必须在try catchtry catch块语句中调用能发块语句中调用能发生异常的方法,其中生异常的方法,其中catchcatch的作用就是捕获的作用就是捕获throwthrow方方法抛出的异常对象法抛出的异常对象例例8-58-5public class public class BankException BankException extends extends ExceptionException String message; String message; public BankException(int m,int n) public BankException(int m,int n) message= message=入账资金入账资金+m+m+是负数或支出是负数或支出+n+n+是正是正数,不符合系统要求数,不符合系统要求.;.; public String warnMess() public String warnMess() return message; return message; public class Bank public class Bank int money; int money; public void income(int in,int out) throws public void income(int in,int out) throws BankException BankException if(in=0|in+out=0) if(in=0|in+out0: assert number0:负数不能是成绩负数不能是成绩; ; sum=sum+number; sum=sum+number; System.out.println( System.out.println(总成绩总成绩:+sum); :+sum);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!