局部内部类: 在一个类的方法内部定义另一个类,那么另外一个类被称作为局部内部类。

局部内部类要注意的细节:

  1,如果局部内部类访问了一个局部变量,那么该变量必须使用final修饰。

代码演示:

class Outer{
    String name = "外部类的name";
    public void text(){
        final int y = 199;
        class inner{
            int x = 10;
            public void print(){
                System.out.println("这个是局部内部类的print方法"+name);
            }
        }
        inner inner = new inner();
        inner.print();
    }
}
class Demo02{
    public static void main(String[] age){
        Outer Outer = new Outer();
        Outer.text();
    }
}
运行结果:

android 匿名内部类 内存泄露 匿名内部类抛出异常_System

 

 匿名内部类:没有类名的类就称作为匿名内部类。

匿名内部类的好处:简化书写。

匿名内部类的使用前提:必须存在继承或者实现关系才能使用。

匿名内部类的格式:匿名内部类与其外部类是继承关系,目前是创建改父类的子类的对象。

比如:  

new Animal(){
      public void run(){
      System.out.println("春婷在写字");
}
} .run();

代码示例:

abstract class Animal5{
    public abstract Animal5 run();
    public abstract void sleep();
}
class Out{
    public void print(){
        Animal5 a = new Animal5() {
            @Override
            public Animal5 run() {
                System.out.println("春婷在放屁");
                return this;
            }

            @Override
            public void sleep() {
                System.out.println("春婷睁着眼睛睡觉");
            }
        };
        a.run();
        a.sleep();
    }
}

class Demo36 {
    public static void main(String[] age){
        Out out = new Out();
        out.print();
    }
}
运行结果:

android 匿名内部类 内存泄露 匿名内部类抛出异常_局部内部类_02

 

 异常:

我们的java程序也是会存在某些不正常的情况的,这些统称为异常

异常的图像分析:

android 匿名内部类 内存泄露 匿名内部类抛出异常_android 匿名内部类 内存泄露_03

 

 

异常体系:

所以异常体系的父类:  Throwable  所有异常或者错误类的超类

Throwable的子类:    Error  错误  错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通过代码去处理错误的

            Exception  异常   是需要通过代码去处理的、

Throwable的常用方法:

    toString()  返回当前异常对象的完整类名+病态信息

    getMessage()   返回的是创建Throwable传入的字符串信息

    printStackTrace()  打印异常的栈信息

代码示例:

public class Demo37 {
    public static void main(String[] ages){
       Throwable y = new Throwable("你好像有那个大病");
        String info = y.toString();
        String me = y.getMessage();
        System.out.println("toString:"+info);
        System.out.println("getMessage:"+me);
        test();
    }
    public static void test(){
        Throwable y = new Throwable();
        y.printStackTrace();
    }
}
运行结果:

android 匿名内部类 内存泄露 匿名内部类抛出异常_匿名内部类_04

 

 如何区分错误与异常:

  如果程序出现了不正常的信息,不那么不正常的信息的类名是以Error结尾的,那么肯定是一个错误。

  如果是以Exception结尾的,那么肯定是一个异常。

疑问:错误的信息是通过printStaticTrace方法打印出来的,那么异常从何而来?

jvm运行到a/b这个语句的时候。发现b为0,除数为0在我们现实生活中是属于不正常的情况,jvm一旦发现这种不正常的情况时候

那么jvm就会马上创建一个对应的异常对象,并调用这个异常对象的printStaticTrace的犯法来处理

异常处理:

  方式一:捕获处理

  捕获处理的格式:

    try{

      可能发生异常的代码;

}catch(捕获的异常类型  变量名){

      处理异常的代码、、、

}

捕获处理要注意的细节:

  1,如果try块中代码出了异常经过了处理后,那么try-catch块外面的代码可以正常的执行。

  2,如果try块中出现了异常的代码,那么在try块中出现异常代码后面的代码是不会执行的。

  3,一个try块可以捕获多种异常类型,但是捕获的异常类型必须要从小到大进行捕获,否则编译报错

疑问一:异常的处感觉没有多大的作用,因为都是输出一个话而已?

    异常处理非常有用,只不过是由于我们目前所接触的知识点太过于局限而已。

疑问二:以后捕获处理的时候是否就是捕获Exception即可?

    错的,因为我们在现实开发中遇到不同的异常类型的时候,我们往往会有不同的处理方式。

    所以要分开不同的异常处理。

代码演示:

public class Demo37 {
    public static void main(String[] ages){
    int[] arr = null;
    div(4,0,arr);
    }
    public static void div(int a,int b,int[] arr){
        int c= 0;
        try {
            c = a/b;
            System.out.println("数组的长度:"+arr.length);
        }catch (ArithmeticException e){
            System.out.println("异常处理了、");
            System.out.println("toString:"+e.toString());
        }catch (NullPointerException e){
            System.out.println("出现了空指针异常、、");
        }catch (Exception e){
            System.out.println("包治百病");
        }
        System.out.println("c ="+c);
    }
}
运行结果:

android 匿名内部类 内存泄露 匿名内部类抛出异常_System_05