java(20130801)异常、集合、ArrayList和LinkedList的比较、Vector和ArrayList的异同

时间:2021-04-23 19:34:18

try {

            inti =10/0;

        }catch (ArrayStoreException e) {

            System.out.println(2);

        } catch (ClassCastException e) {

            System.out.println(3);

        } catch (UnmodifiableSetException e) {

            System.out.println(4);

        } catch (Exception e) {

            System.out.println(1);

        }finally{

            System.out.println(6);

        }

多重格式:

try{可能会抛出异常语句体1

}catch(异常类变量1){

语句体2

}catch(异常类变量2){

语句体3

}

.

.

.

catch(异常类n-2 变量n-2){

语句体n-1

}finally{

            语句体n    }

 

Try{}catch(){}finally{}:

1.语句块可以写多个catch语句

2.父类异常不能子类异常之前

3.如果抛出异常不能和catch中的所有异常精确匹配,那么就将抛出异常自动向上造型(子类到父类),直到匹配。如果不能匹配,就抛出异常。

 

 

try

捕获违例的第一步是用try{可能会抛出异常的语句}语句块选定捕获违例的范围。

catch(异常类型  变量)

在catch语句块中是对违例对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的违例对象。与其它对象一样,可以访问一个违例对象的成员变量或调用它的方法。

getMessage( ) 方法,用来得到有关异常事件的信息

printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。


多重 catch:

一段代码可能会生成多个异常

当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的语句

执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略

 

 

 

finally

捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。

finally语句是任选的

 

如果try或者catch块有return 指令,finally还是会被执行,流程先跳到finally然后再回到return指令

 

如果一个方法(中的语句执行时)可能生成某种Exception,但是并不能确定如何处理这种违例,则此方法应声明抛弃违例

 

throws

声明异常表明该方法将不对这些违例进行处理,而由该方法的调用者负责处理

 

 

EG:

publicclass Person {

//被调方法

    publicvoid meth()throws ClassNotFoundException{

        try{

            Class.forName("comc.wsdasdA.ADASA");

            inti =10/0;

        }catch (ArithmeticException e) {

            thrownew MyExceptionRun();

        }

    }

}

 

publicclass TestMain {

    publicstaticvoid main(String[]args){

        try {

//          int i =10/0;

//          throw new MyException();

            System.out.println("ssss");

            Person p = new Person();

            p.meth();//调用者

        }catch (ClassNotFoundException e) {

            e.printStackTrace();

            System.out.println(2);

        } catch (ClassCastException e) {

            System.out.println(3);

        } catch (UnmodifiableSetException e) {

            System.out.println(4);

        } catch (MyExceptionRun e) {

            e.printStackTrace();

        }catch (RuntimeException e) {

            System.out.println(1);

            e.printStackTrace();

        }finally{

            System.out.println(6);

        }

    }

}

 

 

 

throw

异常是通过关键字 throw抛出,程序可以用throw语句抛出明确的异常。如:

try {

       if(flag<0){

              throw new NullPointerException();

       }

}

throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。

 

自定义异常:必须继承exception或exception的子孙类。

 

//自定义异常类

publicclassMyExceptionRun extends RuntimeException {

 

    /**

     * 动态指定 异常提示信息

     * @param message

     */

    public MyExceptionRun(Stringmessage) {

        super(message);

    }

    @Override

    publicvoid printStackTrace() {

//      System.out.println("同学小学数学没毕业?");

        super.printStackTrace();

    }

}

 

 

publicclass Person {

    publicvoid meth()throws ClassNotFoundException{

        try{

//          Class.forName("comc.wsdasdA.ADASA");

            inti =10/0;

        }catch (ArithmeticException e) {

            thrownew MyExceptionRun("关于数学运算的异常");

        }

    }

}

 

publicclass TestMain {

    publicstaticvoid main(String[] args){

        try {

//          int i =10/0;

//          throw new MyException();

            System.out.println("ssss");

            Person p = new Person();

            p.meth();//调用者

        }catch (ClassNotFoundException e) {

            e.printStackTrace();

            System.out.println(2);

        } catch (ClassCastException e) {

            System.out.println(3);

        } catch (UnmodifiableSetException e) {

            System.out.println(4);

        } catch (MyExceptionRun e) {

            e.printStackTrace();

        }catch (RuntimeException e) {

            System.out.println(1);

            e.printStackTrace();

        }finally{

            System.out.println(6);

        }

    }

}


集合:

Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。

List:是一个有序的集合,可以包含重复的元素

ArrayList:可变的数组,元素允许重复

LinkedList:针对经常插入或者删除中间元素所设计的高效率集合

Set:不能包含重复的元素。

SortedSet是一个按照升序排列元素的Set。

TreeSet:以有序状态保存并可防止重复

Map:包含了key-value对。Map不能包含重复的key

SortedMap是一个按照升序排列key的Map

Map接口和Collection接口没有任何关系。

 

 

ArrayList和LinkedList的比较

ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。

如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。

 

Vector和ArrayList的异同

Vector类中所有的方法都是线程同步的,两个线程并发访问Vector对象是安全的,需要额外的监视器检查,运行效率低些。

ArrayList类中所有的方法是非同步的,程序的效率比Vector高。