您的位置:首页 > 职场人生

【黑马程序员】---java基础---内部类、异常

2015-06-03 23:20 381 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、内部类

1、内部类即是定义在成员位置或局部位置的类。

内部类可以直接访问外部类中的成员,而外部类如果想要访问内部类成员必须创建内部类的实例。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:  外部类名.this。

class Outer{
int num = 4;
class  Inner{
void show(){
System.out.println("inner show run "+num);
}
}
public void method(){
Inner in = new Inner();//创建内部类的对象。
in.show();             //调用内部类的方法。
}
}

 

当内部类定义在外部类中的成员位置上,可以使用一些成员修饰符修饰 private、static。

  1)默认修饰符。

  直接访问内部类格式:外部类名.内部类名 变量名 =  外部类对象.内部类对象;

  Outer.Inner in = new Outer.new Inner();//这种形式很少用。

  但是这种应用不多见,因为内部类之所以定义在内部就是为了封装。想要获取内部类对象通常都通过外部类的方法来获取。这样可以对内部类对象进行控制。

  2)私有修饰符。

  通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。

  3)静态修饰符。

  如果内部类被静态修饰,相当于外部类,会出现访问局限性,只能访问外部类中的静态成员。

  注意;如果内部类中定义了静态成员,那么该内部类必须是静态的。

内部类编译后的文件名为:“外部类名$内部类名.java”;

内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。

2、匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。

匿名内部类其实就是一个匿名子类对象。想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。

匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。

匿名内部类的使用场景:当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。

其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

二、异常

1、对于程序可能出现的错误应该做出预案。 例外是程序中所有出乎意料的结果。(关系到系统的健壮性)

JAVA会将所有的错误封装成为一个对象,其根本父类为Throwable。 

Throwable有两个子类:Error和Exception。

一个Error对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。对于Error错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。 

我们可以处理的Throwable对象中只有Exception对象(例外/异常)。

这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。

可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。

class  ExceptionDemo{ 

  public static void main(String[] args) {

    byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError内存溢出错误  

  } 



在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。 

如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名... 这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。

2、异常的处理方式有两种:1、捕捉;2、抛出。 

对于捕捉:java有针对性的语句块进行处理。

    try{

        需要被检测的代码; 

    } 

    catch(异常类 变量名){  

        异常处理代码; 

    } 

    fianlly{

        一定会执行的代码; 

    }

其中:

    catch (Exception e) { //e用于接收try检测到的异常对象。

        System.out.println("message:"+e.getMessage());//获取的是异常的信息。 

        System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。  

        e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。 

    }

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。  

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。  

throw 和throws关键字的区别: 

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。 

throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。  

通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。  

3、异常分两种: 

1)编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。 

2)运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。  

编译时被检查的异常和运行时异常的区别: 

编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。 声明的原因:是需要调用者对该异常进行处理。 

运行时异常如果在函数内被抛出,在函数上不需要声明。 

不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。  

定义异常处理时,什么时候定义try,什么时候定义throws呢? 功能内部如果出现异常,如果内部可以处理,就用try; 如果功能内部处理不了,就必须声明出来,让调用者处理。  

4、自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。  

自定义异常的步骤: 

1)定义一个子类继承Exception或RuntimeException,让该类具备可抛性。 

2)通过throw 或者throws进行操作。  

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。  

5、try  catch  finally的几种结合方式: 

1、try                   2、try                     3、try

   catch                    catch                      finally

   finally  

这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try  finally集合只为关闭资源。

记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。 System.exit(0); //退出jvm,只有这种情况finally不执行。

6、当异常出现后,在子父类进行覆盖时,有了一些新的特点: 

1)当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。 

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

注意: 

如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。 

如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。  

7、常见异常: 

1)脚标越界异常(IndexOutOfBoundsExceptio
9f87
n)包括数组、字符串; 空指针异常(NullPointerException) 

2)类型转换异常:ClassCastException 

3)没有这个元素异常:NullPointerException 

4)不支持操作异常; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: