一、异常处理

异常简介

在Java中一个异常的产生主要有以下三种原因:

  1. Java内部错误发生异常,Java虚拟机产生的异常
  2. 编写的程序代码中的错误所产生的异常,如:空指针异常
  3. 通过throw语句生成的异常,一般用来告知该方法调用者一些必要信息。

      Java通过面向对象的方法来处理异常。

   Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类;Error 定义了在通常环境下不希望被程序捕获的异常。一般指的是 JVM 错误,如堆栈溢出。

Java中常见的运行时异常:

ArraylndexOutOfBoundException:数组下标越界异常

ClassCastException:类型转换异常

NullPointerException:空指针异常

NumberFormatException:数字转化格式异常

Java常见非运行异常:

    ClassNotFoundException:未找到类

    IllegalAccessException:访问类被拒

    InstantiationException:试图创建抽象类或者接口的对象

二、Error和Exception的异同

     Error(错误)和 Exception(异常)都是 java.lang.Throwable 类的子类,在 Java 代码中只有继承了 Throwable 类的实例才能被 throw 或者 catch。

  Error错误是无法恢复的。error使程序处于非正常状态不需要程序员去捕获

 常见的error(错误):

    NoClassDefFoundError:找不到 class 定义异常

StackOverflowError:深递归导致栈被耗尽而抛出的异常

OutOfMemoryError:内存溢出异常

三、异常处理机制

Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。

try catch语句用于捕获处理异常,finally语句用于在任何情况下都必须执行的代码,

throw语句用于抛出异常,throws语句用于声明可能出现的异常。

finally使程序出没有出错都要执行的,在return执行之前程序结束之前先去执行finally语句在去执行return语句

异常处理机制:

  1. 方法中用try catch语句捕获并处理异常,catch语句可以有多个,用来匹配多个异常;
  2. 对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常,由上层的调用方法来处理。

基本语句:

try{
  逻辑程序块
}catch(ExceptionType1 e){
处理代码块1
}catch(ExceptionTy2 e){
处理代码块2
Throw(e);
}finally{
释放资源代码块
}

使用try – catch-finally语句时需注意:

1、异常处理语法结构中只有 try 块是必需的,也就是说,如果没有 try 块,则不能有后面的 catch 块和 finally 块;

2、catch 块和 finally 块都是可选的,但 catch 块和 finally 块至少出现其中之一,也可以同时出现;

3、可以有多个 catch 块,捕获父类异常的 catch 块必须位于捕获子类异常的后面;

4、不能只有 try 块,既没有 catch 块,也没有 finally 块;

5、多个 catch 块必须位于 try 块之后,finally 块必须位于所有的 catch 块之后。

6、finally 与 try 语句块匹配的语法格式,此种情况会导致异常丢失,所以不常见。

Throws关键字合throw关键字在使用上的区别:

  1. throws用于声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但不一定会发生这些异常,throw则是指抛出的一个具体的异常类型
  2. throws通常不用显示所捕获异常,由系统自动将所有捕获的异常信息抛给上级方法;throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。

  四、自定义异常

     自定义异常的语法:

         

<class><自定义异常名><extends><Exception>

   自定义异常类的类名命名为:***Exeption。

集合、泛型

对于Set、List、Queue和Map这4种集合,其最常用的实现类分别是HasSet、TreeSet、ArrayList、ArrayDueue、LinkedList和HashMap、TreeMap等

一、Collection接口

此接口是List、Set、Queue接口的父类接口,通常情况下不被直接使用

     Collection接口中常用的方法:

boolean add(E e):向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型

        boolean addAll(Collection c):向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true

        void clear():清除集合中的所有元素,将集合长度变为 0

boolean contains(Object o):判断集合中是否存在指定元素

boolean containsAll(Collection c):判断集合是否包含集合C中的所有元素

        boolean isEmpty():判断集合是否为空

返回一个 Iterator 对象,用于遍历集合中的元素

        boolean remove(Object o): 从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true

        int size():返回集合中元素的个数

        Object[] toArray():把集合转换为一个数组,所有的集合元素变成对应的数组元素

二、List集合

   1、Array List类

      该类实现了可变数组的大小,存储在内迭代数据称为元素。

       Array List类的构造方法的两种重载形式:

  1. Array List():构造一个初始容量为10的空列表
  2. ArrayList(Collection<?extends E>c):构造一个包含指定Collection元素的列表,这些元素是按照该Collection的迭代器返回它们的顺序排列的。

  

 ArrayList类和LinkedList类的区别:

       ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。

       ArrayList是基于动态数组数据结构的实现,访问元素速度优于LinkedList。

LinkedList是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于ArrayList。

       对于快速访问对象的需求,使用ArrayList实现执行效率上会比较好。需要频繁向集合中插入和删除元素时,使用LinkedList类比ArrayList效率高效。

       不同的结构对应于不同的算法,有的考虑节省占用空间,有点考虑提高运行的效率,对于程序员而言,两则不可以兼得。高运行速度往往是以牺牲空间做代价,而节省占用空间则是相反的。

三、Set集合

     1、HashSet类

    是按照Hash算法来存储集合中的元素,具有很好的存取和查找性能。

  特点:

          1、不能保证元素的顺序,顺序可能与添加顺序不同,顺序也有可能发生变化;

           2、HashSet不是同步的

           3、集合元素值可以为null。

HashSet类的常用构造方法重载形式:

  1. Hash Set():构造一个新的空的Set集合;
  2. HashSet(Collection<? extends E>c):构造一个包含指定Collection集合元素的新Set集合。

ConcurrentModificationException

     2、TreeSet

只能对实现了 Comparable 接口的类对象进行排序

Comparable 接口的类,以及这些类对象的比较方式:

包装类(BigDecimal、Biglnteger、 Byte、Double、 Float、Integer、Long 及 Short):按数字大小比较;

         Character:按字符的Unicode值的数字大小比较;

         String:按字符串中字符的 Unicode 值的数字大小比较;

四、Map集合

Map是一种键-值对(key-value)集合,Map集合中每一个元素都包含了键对象和值对象。

Map集合的查找是当今查找速度最快的数据结构之一。

key不允许重复,而value允许重复。

遍历Map集合

Map集合的遍历可以只遍历值的集合也可以只遍历键的集合也可以同时遍历

Map 以及实现 Map 的接口类(如 HashMap、TreeMap、LinkedHashMap、Hashtable 等)都可以用以下几种方式遍历:

  1. 在for循环中使用entries实现Map的遍历
  2. 使用for-each循环遍历key或者values
  3. 使用迭代器(Iterator)遍历
  4. 通过键找值遍历,这种方式的效率较低。

五、Collections

1、排序(正、逆)

有这几种方法:

void reverse(List list):对指定 List 集合元素进行逆向排序。

void shuffle(List list):对 List 集合元素进行随机排序(shuffle 方法模拟了“洗牌”动作)。

void sort(List list):根据元素的自然顺序对指定 List 集合的元素按升序进行排序。

void sort(List list, Comparator c):根据指定 Comparator 产生的顺序对 List 集合元素进行排序。

void swap(List list, int i, int j):将指定 List 集合中的 i 处元素和 j 处元素进行交换。

void rotate(List list, int distance):当 distance 为正数时,将 list 集合的后 distance 个元素“整体”移到前面;当 distance 为负数时,将 list 集合的前 distance 个元素“整体”移到后面。该方法不会改变集合的长度。

2、查找、替换操作

用于查找和替换集合的方法:

        Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。

Object max(Collection coll, Comparator comp):根据 Comparator 指定的顺序,返回给定集合中的最大元素。

Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素。

Object min(Collection coll, Comparator comp):根据 Comparator 指定的顺序,返回给定集合中的最小元素。

void fill(List list, Object obj):使用指定元素 obj 替换指定 List 集合中的所有元素。

  1. 复制

语法:

void copy(List<? Super T> dest,List<?extends T> src)

dest和src分别表示目标集合对象,源集合对象。

六、Iterator(迭代器

迭代器是一个接口。

Iterator接口里定义了四个方法:

  1. boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true;
  2. Object next():返回集合里的下一个元素;
  3. void remove():删除集合上一次next方法返回的元素;

void forEachRemaining(Consumer action):可以使用Lambda表达式来遍历集合元素。