一、内部类

  1. JAVA类的成员,除了成员变量和方法外,还可以有内部类
  2. 在类中定义地另一个类,叫做内部类,包含内部类的类称为外嵌类
  3. 内部类可调用外嵌类的成员变量方法
  4. 内部类不能声明static变量和方法。
  5. 外嵌类可以使用内部类声明对象
  6. 内部类仅供外部类使用
  7. 内部类生成的字节码文件的名字格式为“ 外嵌类名$内部类名”。
  8. 内部类可以被修饰为static内部类,这样在其他类中可使用static内部类来创建对象了。

二、匿名类

  1. 使用一个类的子类的类体创建一个对象,及除了使用父类的构造方法外还有类体。
    new Bank() {
        匿名类的类体
    }

     

  2. 匿名类可以继承和重写父类方法,匿名类一定是内部类
  3. 匿名对象的引用可以传递给匹配参数。
    void f(A a) {
    }

    向该方法传递A的子类对象,却未提供子类,则可考虑使用匿名类。

  4. 假设Computable是一个接口,JAVA允许用接口名和类体创建一个匿名对象。
    new Computable() {
       实现接口的匿名类的类体 
    };

     

  5. 若某方法参数是接口类型,可以把用接口名和类体创建的匿名对象传递给此参数,类体必须重写接口内全部方法。

三、异常类

  1. JAVA通过关键字throw抛出一个Exception子类的事例表示异常发生。
    int number = Integer.parseInt("ab89");
    /*Integer为java.lang包中的类,可将纯数字字符串转换为int数据
        磁带吗执行异常,执行过程中抛出NumberFormatException对象*/

     

  2. JAVA允许定义方法时声明该方法调用过程中可能出现的异常
  3. 一场对象可调用如下方法输出有关异常信息:
    public String getMessage();
    public void printStackTrace();
    public String toString();

     

四、try-catch语句

  1. JAVA使用try-catch语句来处理异常,将可能出现的异常操作放在try部分,一旦try部分抛出异常对象,结束try转向执行catch部分。
  2. 程序将发生异常后的处理放在catch部分,try-catch语句可以包含几个catch
    try {
        包含可能发生的异常语句
    }
    catch(ExceptionSubClass1 e) {
        ...
    }
    catch(ExceptionSubClass2 e) {
        ...
    }

    各个catch参数中的一场类都是Exception的子类,表明try部分可能发生的异常,他们之间不能有父子关系

五、自定义异常类

  1. 可以扩展Exception类定义自己的异常类,根据程序需要规定哪些方法产生这样的异常
  2. 一个方法在声明时可以使用throws关键字声明要产生的若干异常,并用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致方法结束执行

六、断言

  1. 断言:用于程序不准备捕获鸭肠而处理的错误,在调试代码阶段发挥作用,可发现一些致命错误。
  2. 断言句语法格式:
    assret booleanException;                     //例如assert number >= 0;true时继续执行,否则结束执行
    assret booleanException:messageException;    //false时停止执行,并输出messageException表达式的值,指示用户出现问题

     

  3. 启用与关闭断言语句:用解释器直接运行程序时,默认关闭断言语句。调试程序时可使用-ea启动断言语句:
    java -ea Example7_6

     

七、带finally子语句的try-catch语句

  1. 在执行try-catch语句后,执行finally子语句,无论在try部分是否发生异常,finally子语句都会被执行。
  2. 两种特殊情况:一是如果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);
    }
}