2020-03-10内部类,异常

内部类定义在局部时:

1.不可以被成员修饰符(static等)修饰

2.可以直接访问外部类中的成员(因为还持有对外部类的引用),不可以访问内部类所在的局部中的变量,只能访问final修饰的局部变量。final局部变量在方法结束后出栈。



匿名内部类

1.就是内部类的简写格式(没名字的内部类)

2.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口


格式:            new 内部的父类/接口()------------>构造函数

                        {复写/实现内容}


这代表创建一个父类的匿名子类对象,这个对象可以调用成员(包括实现父类方法,或者新创建的子类方法)

如果要为对象起名字,可以利用多态:父类 名字 = new 父类(){复写方法},但是使用该变量名只能使用父类方法。

可以通过静态函数返回一个父类/接口类型的匿名对象,然后实现调用。

注意:如果父类方法太多,不建议用匿名内部类,因为要对父类的方法进行复写;如果接口的方法不多,可以直接传进去一个匿名对象,从而避免创建一个新类实现接口


异常

异常也是具体的事物,也可以通过java类的形式进行描述,并封装成对象。是java对不正常情况进行描述后的对象体现。

严重的:Error类进行描述,一般不编写代码处理

非严重的:通过Exception类进行描述,可以使用针对性方式处理

两者都有一些共性内容----父类是Throwable类

异常的处理:java提供特有语句try catch finally

        try{需要检测的代码}

        catch(异常类 变量){处理异常的代码:处理方式}

        finally{一定要执行的语句}

问题被封装成了对象,抛给了调用者,try检测到问题,跳转到catch并把对象给catch,没问题不执行catch

(Exception e = new ArithmeticException)


对catch到的异常现象进行常见方法的操作:

异常类.getMessage()可以返回详细信息

toString()返回更详细的字符串

printStackTrace()返回异常名称,异常信息和异常出现位置,就是jvm默认的异常处理机制

标识:throws Exception 通过关键字throws声明了该功能可能会出现问题。把问题抛出



对多异常的处理

1.声明异常时,建议声明更为具体的异常,可以处理更具体,并且可以声明多个异常。

2.声明几个异常,就对应几个catch块。如果多个catch块出现继承的异常,父类异常catch放在最下面

3.catch处理时,要定义具体的处理方式,不应只输出问题语句


自定义异常:

新关键字throw(而不是throws):throw new NewException

当函数内部出现了throw抛出异常对象,那就必须要给出对应的处理动作。要么在内部try catch处理,要么在函数上声明对象(抛)

*函数出现异常,函数上需要声明throws 异常

定义异常信息:复写getMessage(),因为父类中已经把异常信息的操作都完成了,所以子类在构造时,将异常信息通过super语句传给父类构造函数,就可以直接通过getMessage()得到异常信息

继承Exception原因:异常体系有一个特点:异常类和异常对象都需要被抛出,都具备可抛性,只有Throwable类才有这个特征,只有这个体系中的类和对象才可以被抛(throw.throws)



throws使用在函数上,跟的异常类;throw使用在函数内,后面跟的是异常对象.

runtime异常 特殊

如果在函数内容抛出该异常,函数上可以不用声明,编译通过。因为不需要让调用者处理。

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过(因为没办法处理,希望程序停止并修正代码)

异常分两种:

1.编译时被检测的异常,非Runtime,没有标识的编译失败

2.编译时不被检测的异常(RuntimeException以及子类)


异常finally

存放的是一定会被执行的代码,通常用于关闭资源。即使函数中有return也会执行这里的代码。

应用:例如数据库的使用有:连接数据库,操作数据,关闭数据库。而关闭数据库的操作是抛出异常后必须要执行的,所以关闭数据库的操作要放到finally。

格式:try+catch,try+catch+finally,try+finally

catch是处理异常,如果没有就代表异常不被处理,如果异常是检测时异常,那么必须声明


异常在子父类覆盖中的体现:

1.子类覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法:只能抛出父类的异常或者该异常子类的异常(这是因为父类的检测方法只能接收父类的异常或该异常的子类),如果发生新异常不能throw,只能try。

2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。

3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不可以抛出异常。如果子类出现异常必须进行try,不能throw。


你可能感兴趣的:(2020-03-10内部类,异常)