一、内部类
- JAVA类的成员,除了成员变量和方法外,还可以有内部类。
- 在类中定义地另一个类,叫做内部类,包含内部类的类称为外嵌类。
- 内部类可调用外嵌类的成员变量和方法。
- 内部类不能声明static变量和方法。
- 外嵌类可以使用内部类声明对象。
- 内部类仅供外部类使用。
- 内部类生成的字节码文件的名字格式为“ 外嵌类名$内部类名”。
- 内部类可以被修饰为static内部类,这样在其他类中可使用static内部类来创建对象了。
二、匿名类
- 使用一个类的子类的类体创建一个对象,及除了使用父类的构造方法外还有类体。
new Bank() { 匿名类的类体 }
- 匿名类可以继承和重写父类方法,匿名类一定是内部类。
- 匿名对象的引用可以传递给匹配参数。
void f(A a) { }
向该方法传递A的子类对象,却未提供子类,则可考虑使用匿名类。
- 假设Computable是一个接口,JAVA允许用接口名和类体创建一个匿名对象。
new Computable() { 实现接口的匿名类的类体 };
- 若某方法参数是接口类型,可以把用接口名和类体创建的匿名对象传递给此参数,类体必须重写接口内全部方法。
三、异常类
- JAVA通过关键字throw抛出一个Exception子类的事例表示异常发生。
int number = Integer.parseInt("ab89"); /*Integer为java.lang包中的类,可将纯数字字符串转换为int数据 磁带吗执行异常,执行过程中抛出NumberFormatException对象*/
- JAVA允许定义方法时声明该方法调用过程中可能出现的异常。
- 一场对象可调用如下方法输出有关异常信息:
public String getMessage(); public void printStackTrace(); public String toString();
四、try-catch语句
- JAVA使用try-catch语句来处理异常,将可能出现的异常操作放在try部分,一旦try部分抛出异常对象,结束try转向执行catch部分。
- 程序将发生异常后的处理放在catch部分,try-catch语句可以包含几个catch。
try { 包含可能发生的异常语句 } catch(ExceptionSubClass1 e) { ... } catch(ExceptionSubClass2 e) { ... }
各个catch参数中的一场类都是Exception的子类,表明try部分可能发生的异常,他们之间不能有父子关系。
五、自定义异常类
- 可以扩展Exception类定义自己的异常类,根据程序需要规定哪些方法产生这样的异常。
- 一个方法在声明时可以使用throws关键字声明要产生的若干异常,并用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致方法结束执行。
六、断言
- 断言:用于程序不准备捕获鸭肠而处理的错误,在调试代码阶段发挥作用,可发现一些致命错误。
- 断言句语法格式:
assret booleanException; //例如assert number >= 0;true时继续执行,否则结束执行 assret booleanException:messageException; //false时停止执行,并输出messageException表达式的值,指示用户出现问题
- 启用与关闭断言语句:用解释器直接运行程序时,默认关闭断言语句。调试程序时可使用-ea启动断言语句:
java -ea Example7_6
七、带finally子语句的try-catch语句
- 在执行try-catch语句后,执行finally子语句,无论在try部分是否发生异常,finally子语句都会被执行。
- 两种特殊情况:一是如果try-catch语句中执行了return语句,那么finally子语句仍然会被执行。二是如果try-catch语句中执行了程序退出代码,即System.exit(0);,则不执行finally子语句即后其他语句。
习题
7.4
package Practice7_4; import java.util.Scanner; public class Practice7_4 { public static void main(String[] args) { Scanner reader = new Scanner(System.in); double sum = 0; int m = 0; while(reader.hasNextDouble()) { double x = reader.nextDouble(); assert x>=0&&x<=100:"这是一个非法的成绩数据"; sum = sum + x; m++; } System.out.printf("%d个数的和为%f\n",m,sum); System.out.printf("%d个数的平均值为%f\n",m,sum/m); } }