异常处理:

1.  异常:程序在执行过程中所产生的问题。

        异常的三种类:①检查异常:又叫checdked异常或者受检异常。通常是用户错误或者不能被程序员所预见的问题。检查异常需要被解决之后才能通过编译。

          ②运行时异常:程序在运行过程中可能发生的、可以被程序员所避免的异常类型。

          ③错误:事实上错误不是异常,但却是用户和程序员无法控制的问题。

2.  异常的控制流程

异常是被一个方法抛出的对象。

  (1) 处理异常的三个方法:①捕获这个异常,不让它沿着调用栈继续向下抛。

            ②捕获这个异常,并继续向下抛。

            ③不捕获这个异常,导致方法从调用栈中被弹出,异常对象继续抛给调用栈下面的main()方法。

调用栈中有多少方法,程序控制流程都将继续在调用栈中继续向下执行。

printStackTrace()方法来打印调用栈跟踪信息。

3.  Throwable类:

  (1) 异常的三种类型拥有一个公共的父类:java.lang.Throwable,只有Throwable类型的对象能被JVM抛出。Throwable的两个子类:Exception和Error。

     Java语言中异常的继承层次关系就是基于异常的三个类。

  (2) 如果一个类是RuntimeException类的子类,那么这个子类代表了一个运行时异常。

    所有的异常都是Exception类的子类;异常处理和声明规则是一个仅适用于检查异常的基本Java功能。

  (3) Exception对象是Throwable类型的Java对象。

4.  捕获异常:  



1 try{
2      //被保护的代码   
3 }catch{
4     //捕获块
5 }



忽略。

    catch先捕获特殊异常,后捕获一般异常。

  (2) 一个try/catch并不能捕获一切:一个try块后可以跟多个catch块



1 1 try{
2 2      //被保护的代码   
3 3 }catch{
4 4     //捕获块
5 5 }catch{
6 6     //捕获块
7 7 }catch{
8 8     //捕获块
9 9 }



  由于Exception是所有异常的父类,因此可以使用Exception类捕获所有的检查异常和运行时异常。

5.  异常处理和声明规则:

不适用于运行时异常。

throws来声明异常,关键字throws出现在方法签名的末尾。

         一个方法可以声明它抛出多个异常,多个异常之间用逗号分隔。

1 public void ( double amount ) throws

  2. 抛出异常:使用throw关键字抛出异常,这个异常可以是新的异常实例,也可以是刚刚捕获的异常。throw语句将导致当前代码立即停止执行,并且异常将被抛给调用栈中的         前一个方法。

finally:

        用于在try块后创建一个代码块,finally代码块总是会执行,不管异常是否发生。finally块内可以执行任何操作。

        作用:简化代码。

  4. 用户自定义异常:

    编写用户总定义异常类时应注意:

      ①所有的异常必须是Throwable的子类;

      ②如果我们想编写一个可以自动被异常处理或声明规则强制的检查异常,就需要继承Exception类;

      ③如果想编写一个运行时异常,就需要继承RuntimeException类。

常用类:

1.  系统相关类:

   1. System类:代表当前Java程序的运行平台。

是一个final类,该类的所有属性和方法都是静态的;

                 (2)  System类常用于语记录程序执行的时间、复制数组、确定当前的系统属性和获取系统环境变量的等;

      (3) 要强行终止虚拟机,退出正在执行的程序使用的代码:System.exit(0);  。

     Runtime类代表Java程序的运行时环境。

   2. String类:包含了一个不可变的字符串

      创建String对象的方法:

        (1) 使用String对象的构造器显式创建:

            eg:String str = new String( " Hello " );

        (2) 通过用字符串常量直接给String类型变量赋值隐式创建:

            eg:eg:String str = " Hello " ;

   2. StringBuffer类:代表一个内容可变的字符串。

      (1) 一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象;

      (2) StringBuffer在进行字符串处理时,不生成新的对象,所以在内存使用上优于String。

      (3) 使用StringBuffer创建字符串对象只能通过使用StringBuffer的构造器创建:

          eg:eg:StringBuffer str = new StringBuffer( " Hello " );

      (4) StringBuffer偏重于字符串的变化,例如追加、插入、删除;

        (5) StringBuffer类的append()方法用于字符串连接。

   3. StringBuilder类:

      与StringBuffer相比:StringBuffer是线程安全的,而StringBuilder则不是,因此StringBuilder性能高于StringBuffer

2.  包装类:将Java中的八种基本数据类型封装成类

   使用包装类时需注意:

      (1) 所有的包装类都是final类型,不能创建它们的子类;

      (2) 包装类是不可变类。

   使用parse XXX (String s)方法可以将字符串转换为对应的基本数据类型

3.  正则表达式:

        正则表达式由普通字符、字符类、通配符和数量词组成。

   常用正则表达式:

      匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />;

      匹配首尾空白字符的正则表达式:^\s*|\s*$;

      匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*;

      匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$;

      匹配ip地址:\d+\.\d+\.\d+\.\d+;

    匹配特定数字:
      ^[1-9]\d*$    //匹配正整数
      ^-[1-9]\d*$   //匹配负整数
      ^-?[1-9]\d*$   //匹配整数
      ^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
      ^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
      ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
      ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
      ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
      ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
      ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)

    匹配特定字符串:
      ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
      ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
      ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
      ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
      ^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

   使用正则表达式:

    eg:    



1 Pattern  ptn   =   Pattern . compile(str);
2 Matcher  Matcher  =  ptn . matcher(正则表达式);
3 if( matcher.matches() ){
4     System.out.println("合法");
5 } else{
6     System.out.println( "非法" );
7 }



Java集合框架(JCF):

  Java集合框架由一组类和接口组成。

主要功能:将存储的数据以某种结构组织,并以特定的方式来访问这些数据。

      目标:提供一个处理对象集合的通用框架减少程序员处理不同对象集合时的编码量。

被添加到集合中的对象称为一个元素。两个元素通过使用equals()方法比较,若返回true,则两个元素重复。

  (3) 通过是否允许重复、是否有顺序、是否允许添加null元素将对象存储方式分为三种:

      ①Set(集):无顺序、不重复;

      ②List(列表):对象按索引排序,可重复;

      ③Map(映射):包含一对“键对象—值对象”映射,键对象不能重复,值对象可以重复。

List接口:

     特点:①List中的元素是有顺序的;

      ②允许元素重复;

      ③其实现类通常支持null元素;

中的元素。

ArrayList、LinkedList。

ArrayList:表示一种编入索引的元素。与数组相比,ArrayList没有预先确定的大小,其长度可按需增大;

        泛型<E>:允许在定义类、接口时制定类型形式参数,该类型形式参数将在声明变量、创建对象时确定(即传入的实际参数)。

           eg:ArrayList<Integer> al = new ArrayList<Integer>();

           作用:用泛型将参数类型化,以达到类型安全的母目的,并省去从集合中取出数据在转型的动作。

        迭代器遍历:

            Iterator it = 名.iterator();

            while( it.hasNext() ){

                Object obj = it.next();

                System.out.println( obj );

            }

LinkedList:实现了双向链表功能的列表。

    ①ArrayList以数组的方式实现,查询效率高;

    ②LinkedList以链表方式实现,用于频繁的增删;

    ③Vector:与ArrayList相似,是线程安全的,性能低于ArrayList。

 LinkedList > ArrayList > Vector 

Set接口:

  特点:①不能包含重复元素;

     ②可能有顺序,也可能没顺序;

     ③元素可能有顺序无序,所以不能以索引访问Set中的元素。

  实现Set接口的常用类:HashSet、TreeSet。

     HashSet:①遍历时元素无顺序;

           ②不允许出现重复元素;

           ③允许包含null元素。

     TreeSet:保证集合中的对象按照一定顺序排序,默认情况下采用自然排序方式。

          自然排序:按集合元素大小,升序排序;

          自定义排序:按特定比较器排序(必须使用Comparator接口,同时必须改写要存入到TreeSet中的对象的cimpare(object o1, object o2)方法 )。

Map接口:

    它对应的是一种从键(Key)到值(Value)的对应关系的集合。Key—Value单项一对一关系,两者可以为任意类型。

    HashMap类:是基于哈希算法的Map接口的实现,键是唯一的。

          创建一个新的HashMap:

            eg:Map <String, String> map = new hashMap<String, String>();

反射:

1. 类的加载由加载器完成,JVM本身包含了一个类加载器————根类加载器

    (1) 根类加载器加载核心java类;

    (2) 扩展类加载器加载扩展的Java类;

    (3) 系统类加载器记载应用程序自身的类。

2.  连接:类被加载后,系统就为之创建一个对应的Class对象, 接着进入连接阶段,连接阶段会负责把类的二进制数据合并到JRE中;

     三个阶段:①验证;②准备;③解析。

3.  初始化:JVM负责对静态属性进行初始化

      初始化的两种方式:①声明静态属性时指定初始值;

               ②使用静态初始化块为静态属性指定初始值。

反射:是指在Java中,可以在运行期载入,探知某种使用编译期完全未知的类。

   使用反射查看类信息:

      获得Class对象的三种方式:

        1. forName静态法:

            eg:Class  c = Class.forName( "权限定类名" );

        2. 在编译期知道类名的情况下调用该类的Class属性

            eg:Class c = 类名.class;

        3. 调用对象的getClass()方法返回该对象所属类对象的Class对象

            eg:Class c = 对象名. getClass();