Java学习笔记---其他类特性与异常处理

1.    final方法
       一个定义为private的方法隐式的被指定为final类型,这样无须将一个定义为private的方法再定义为final类型
 
2.    final类
       定义为final的类不能被继承。如果希望一个类不允许任何类继承,并且不允许别人对这个类有任何修改,可以将这个类设置成final形式
       将某个类设置成final形式,类中的所有方法都被隐式设置成final形式,但是final类中的成员变量可以被定义为final或非final形式
 
3.    成员内部类
       内部类可以访问外部类的成员,但是内部类的成员只有在内部类的范围内是可知的,不能被外部类使用
       内部类的实例一样要绑定在外部类的实例上。
       在主方法或者其他类中实例化本实例的内部对象,必须在new操作符之前提供一个外部类的引用。
       Eg:
            OutClass out = new OutClass( );
            OutClass.innerClass in2 = out.new innerClass( );
       在实例化内部类对象的时候,不能在new操作符之前使用外部类名称那种形式进行实例化内部类对象,而应该使用外部类的对象来创建其内部类的对象。
       内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则不能创建内部类对象;
       当一个类有内部类时,这个外部类不能声明为private或protected。
 
4.    静态内部类
       在内部类前面添加static修饰符,这个内部类就变成了静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员
       静态内部类的最大特点就是不能使用外部类的非静态成员
       如果创建静态内部类的对象,不需要外部类对象的引用。
 
5.    异常处理
       try语句块存放的是可能发生异常的Java语句。catch程序块在try语句块之后,用来处理被捕获的异常。另外,finally语句块是异常处理结构的最后执行部分。不管try块中代码如何退出,都将执行finally块。finally块是可选部分。
        try{
        //程序代码块
        }catch(Exceptiontype1 e){
                    //对Exceptiontype1异常的处理
        }catch(Exceptiontype2 e){
                    //对Exceptiontype2异常的处理
        }finally{
                    //程序块
        }
 
        catch关键字后边括号中的参数类型Exceptiontype就是try代码块传递给catch代码块的异常类型
        完整的异常处理语句都会包含finally语句。不管程序中有无异常发生,并且不管之间的try-catch是否顺利执行完毕,都会执行finally语句
        在以下3中特殊情况下爱,finally块不会被执行
        1.在finally语句块发生异常
        2.在前面的代码块中用了System.exit()退出程序
        3.程序所在的线程死亡。
        由于exception是所有异常类的父类,如果将catch(Exception e)代码放在catch代码块的最前面,后面的catch块永远得不到执行,也就没有什么意思了
       try.....catch....语句块中,多个catch的顺序一定要遵循子类在上父类在下的规则。
 
6.    throw和throws
       throws说明你有哪个可能,倾向,还未抛出,可能抛出异常
       throw的话,那就是你把那个倾向变成真实的了,已经抛出了异常
        同时:

        1)throws出现在方法函数头;而throw出现在函数体;   
        2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常;   
        3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

     Eg:
public class CustomExceptionDemo {
    private double sum = 0;    
        public double computeProductSum(double price) throws NumberValueException{   //可能会发生NumberValueException异常
            if(price < 0)
                throw new NumberValueException(price);                //已经发生抛出了NumberValueException异常
            else{
                sum = sum + price;
            }
            return sum;
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            double priceSum = 0;
            CustomExceptionDemo demo = new CustomExceptionDemo();
            try{
                priceSum = demo.computeProductSum(5.10);
                priceSum = demo.computeProductSum(-12);
            }catch(NumberValueException e){                                //捕获到了NumberValueException异常
                e.printStackTrace();
                System.out.println("单价" + e.getPrice() + "非法,请核对后重新计算。");
            }
            System.out.println("商品单价的总和是:" + priceSum);
        }
}

 

posted @ 2013-04-25 21:56  Xu Feng  阅读(243)  评论(0编辑  收藏  举报