内部类和异常

内部类

内部类,即类内部的类。类中类。形式如下:

public class Outter{ // 外部类 
class Inner{ // 内部类 
} 
}

内部类的作用
内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
内部类拥有外围类的所有元素的访问权限
可以实现多重继承
匿名内部类优化接口
隐藏细节
平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许
有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。这看起来没
什么作用,但是当内部类实现某个接口的时候,在进行向上转型,对外部来说,就完全隐藏了接口的实
现了。
可以无条件地访问外围类的所有元素
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通
过this访问外部类的成员。
可以实现多重继承
这个特点非常重要,它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加
完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。
但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了
内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。
通过匿名内部类来优化简单的接口实现
有了匿名内部类,可以不需要定义一个新的类,而直接通过匿名内部类创建对象。对那些只是用一
次的类是非常方便的事情。

内部类的分类

成员内部类、局部内部类、匿名内部类和静态内部类。

内部类的共性
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部
类的类名和$符号 。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的
成员变量,无论是否是private的 。
内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态
成员变量

  1. 成员内部类

成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
内部类中的变量访问形式
内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量;若有同名
情况时,直接访问会导致内部类中的局部变量将外部类的成员变量覆盖,访问内部类本身的成员变量可
用this.属性名,访问外部类的成员变量需要使用Out.this.属性名
创建内部类实例

Out.Inner inner=new Out().new Inner(); 
//或 
Out out=new Out() Out.Inner inner=out.new Inner()
  1. 私有内部类
    如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类,此时我们必须
    在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象
    也就是说,此时的内部类只有外部类可控制
  2. 匿名内部类
    定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类 , 以这种方法定义的没有名字的类成为匿名内部类
  3. 静态内部类
    如果用static 将内部类静态化,那么内部类就只能访问外部类的静态成员变量,不能直接访问外部
    类的实例变量、实例方法,只有通过对象引用才能访问。
    其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(静
    态内部类不通过外部类实例进行创建对象
  4. 局部内部类
    将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方
    法。局部内部类和成员内部类的区别在于局部内部类的访问仅限于方法内
    如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义类
    至于final在这里并没有特殊含义,只是一种表示形式而已
    局部内部类:像局部变量一样,不能被public, protected, private和static修饰。jdk1.8 +可以不加final

异常

概念
异常(Exception) 即例外,程序没有按自己预想的结果运行出来,出现了非正常情况,即“程序得病了”。怎么让我们写的程序做出合理的处理,不至于崩溃是我们关注的核心。 异常机制就是当程序出现错误,程序如何安全退出的机制。
所谓错误是指在程序运行的过程中发生的一些例外事件(如:除0,数组下标越界,所要读取的文件不存在)。
Java异常类是Java提供的用于处理程序中错误的一种机制。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或发生不可预见的结果。
Java程序的执行过程中如出现例外事件,可以生成一个异常类对象,该异常对象封装了例外事件的
信息并将被提交给Java运行时系统,这个过程称为抛出( throw )异常。 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这
一过程称为捕获(catch)异常。
分类:Runtime Exception 和 CheckException
Runtime Exception
Runtime Exception类是 Exception 类的子类,叫做运行时异常,Java 中的所有运行时异常都会直
接或者间接地继承自 RuntimeException 类。
这一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显示的声明
或捕获将会对程序可读性可运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序
(用户可不必对其处理);我们可以通过程序的健壮性来处理,不推荐使用异常处理机制来处理。

例如

NullPointerException: 当程序访问只有引用没有对象的成员属性或成员方法。怎么处理?
ArithmeticException: 除数为 0ClassCastException:多态时类型转换错误
ArrayIndexOutOfBoundsException: 访问的元素下表超过数组长度
NumberFormatException: 数字格式异常!

*CheckException(*需要处理的)
Java 中凡是继承自 Exception,而不继承自 RuntimeException 类的异常都是非运行时异常,也叫
检查时异常。 如:IOException。 必须要对其进行处理,否则无法通过编译。这类异常的产生不是程序
本身的问题,通常由外界因素造成的。 为了预防这些异常产生时,造成程序的中断或得到不正确的结
果,Java 要求编写可能产生这类异常的程序代码时,一定要去做异常的处理。

处理:

public static void test() throws Exception{
 System.out.println("Hello World");
 //抛出异常
 throw new Exception();
}

异常捕获 try catch finally
对于编译(非运行)时异常( checked exception ),必须要对其进行处理,否则无法通过编译。处理方式有两种:
异常捕获
异常处理

扫描二维码关注公众号,回复: 11086475 查看本文章
try{
     //可能发生异常的代码
     //如果发生了异常,那么异常之后的代码都不会被执行
}catch(XXException e){
     //异常处理代码
}catch(Exception e){
     //异常处理代码
}finally{
     //不管有没有发生异常,finally语句块都会被执行
}

try代码段包含可能产生例外的代码
try代码段后跟有一个或多个catch代码段
每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法
当异常发生时,程序会中止当前的流程,根据获取异常的类型去执行相应的catch代码段
一个 try 后面可以跟多个 catch,但不管多少个, 最多只会有一个catch 块被执行。
finally段的代码无论是否发生异常都有执行

try语句
try{…}语句制定了一段代码,该段代码就是一次捕获并处理意外的范围。
在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分
别对这些异常做相应的处理。
如果没有意外产生,所有的catch代码段都被略过不执行。
catch语句
在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处
理可能产生的不同类型的异常对象。
在catch中声明的异常对象封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些
方法获取这些信息。
向外 声明( 抛出) 异常 throws

public static void test() throws Exception{
      //可能发生异常的代码
      //如果发生了异常,那么异常之后的代码都不会被执行

}

在产生异常的方法声明后面写上 throws 某一个 Exception 类型,如 throws Exception,将异常抛出到外面一层去
异常与重写声明
子类声明的异常范围不能超出父类的异常范围

class P{
   public void test() throws IOException,SQLException{
   }
}
class C extends P{
    public void test() throws Exception , SQLException{
    }
}

错误与异常

JDK中定义了很多异常类,这些类对应了各种各样可能出现的例外事件。我开着车走在路上,一头
猪冲在路中间,我刹车,这叫一个 异常。我开着车在路上,发动机坏了,我停车,这叫错误。系统处于
不可恢复的崩溃状态。发动机什么时候坏?我们普通司机能管吗?不能。发动机什么时候坏是汽车厂发
动机制造商的事。
在这里插入图片描述
Error:
称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处
理。Error 类层次描述了 Java 运行时系统内部错误和资源耗尽错误。这类错误是我们无法控制的,同
时也是非常罕见的错误。所以在编程中,不去处理这类错误。Error 表明系统 JVM 已经处于不可恢复
的崩溃状态中。我们不需要管他。 如:写代码时突然断电,或者内存溢出。
Exception:
所有异常的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示地声
明或捕获。

使用自定义的异常

使用自定义异常一般有如下步骤:
1、 通过继承java.lang.Exception类声明自己的异常类
2、 在方法适当的位置生成自定义异常的实例,并用throw语句抛出
3、 在方法声明部分用throws语句声明该方法可能抛出的异常

发布了22 篇原创文章 · 获赞 6 · 访问量 455

猜你喜欢

转载自blog.csdn.net/ffgyfgj/article/details/105163352