Java——异常和内部类

异常

try{ 
有可能出现异常的语句 ; 
}[catch (异常类型 异常对象) {
} ... ]
[finally {
异常的出口
}]
  • try 代码块中放的是可能出现异常的代码;
  • catch 代码块中放的是出现异常后的处理行为;
  • finally 代码块中的代码用于处理善后工作, 永远都会在最后执行;
    一般用于资源关闭;
  • 建议return不要放在 finally 块中,因为可能会抑制try或者catch中的return;
  • 其中 catch 和 finally 都可以根据情况选择加或者不加;

运行时异常
编译时异常(受查异常):必须显式进行处理;

Exception是异常类的父类;

自定义异常

  • 需要自己定义一个类实现Exception;
  • 在抛出的时候需要自己进行throws;
  • 编译时期;

内部类

定义在类里面

  • 实例内部类
  • 静态内部类
  • 匿名内部类
  • 本地内部类

实例内部类

  • 不能有静态的数据成员;
    eg:
public class TestDemo3 {
		public int data1 = 10;
		public static int data2 = 20;

		//实例内部类
		class InnerClass{
			public int data1 = 100;
			public static int data2 = 300;//报错——》
		}
	}
  • 如何拿到内部类:外部类类名.内部类类名 = 外部类对象.new 内部类方法();
    eg:
class OuterClass {
    public int data1 = 10;
    public static int data2 = 20;

    //实例内部类
    class InnerClass{
        public int data1 = 100;
        //public static int data2 = 300;//报错
        public int data2 = 999;
        public InnerClass(){
            System.out.println("InnerClass()");
        }
        public void func(){
            System.out.println("data2"+data2);
        }
    }
}
public class TestDemo3{
    public static void main(String[] args){
        OuterClass o = new OuterClass();
        OuterClass.InnerClass in = o.new InnerClass();
        in.func();
    }
}
  • 面试问题:实例内部类是否拥有外层类对象的/是否有额外的开销?–>是;

静态内部类
eg:

class OuterClass{
    public int data1 = 10;
    public static int data2 = 20;
    
    static class InnerClass{
        public int data1 = 999;
        public static int data2 = 888;
        
        public InnerClass(){
        }
        
        public void func(){
            System.out.println("data1:"+data1);
            System.out.println("data2:"+data2);
        }
    }
}
public class TestDemo3{
    public static void main(String[] args){
        OuterClass.InnerClass in = new OuterClass.InnerClass();
        in.func();
    }
}
  • 不能直接在内部类中访问外部类的静态数据成员,但是可以间接访问;
    eg:
class OuterClass{
    public int data1 = 10;
    public static int data2 = 20;

    static class InnerClass{
        public int data1 = 999;
        public static int data2 = 888;
        OuterClass o2 = null;
        public InnerClass(){
        }
        public InnerClass(OuterClass o ){
            o2 = o;
        }
        public void func(){
            System.out.println("data1:"+data1);
            System.out.println("data2:"+data2);
            System.out.println(o2.data1);
        }
    }
}
public class TestDemo3{
    public static void main(String[] args){
        OuterClass.InnerClass in = new OuterClass.InnerClass();
        in.func();
    }
}

匿名内部类
eg:

//匿名内部类
class Mythread{
    public void func(){
        System.out.println("hhh");
    }
}
public class TestDemo3{
    public static void main(String[] args){
        new Mythread(){
            @Override
            public void func(){
                System.out.println("hello");
            }
        }.func();
    }
}

本地内部类

你可能感兴趣的:(Java)