day14

 二、文档注解,文档注释
    文档注解的声明,也有JDK核心类库声明过了
    使用:程序员使用
    读取:javadoc.exe来读取
    使用javadoc时,可以加参数 -encoding UTF-8
    @author:表示作者
    @version:表示版本
    @since:起始版本
    @see:另请参考
    @param:形参
    @return:返回值
    @throws:抛出的异常列表
    @param、@return、@throws只能在方法上使用
    @param 形参名 形参的数据类型  形参的解释
    @return 返回值类型  说明
    @throws 异常类型 说明

三、单元测试

     声明和定义:JUnit框架中定义的
     使用:程序员
     读取:由java + JUnit框架读取
     如何运行?
     如果没有选择,那么当前源文件中的所有的单元测试都会运行
     如果选中某个方法,只运行某一个
    @Test:
     加在需要单独测试的方法。
     并且有要求:方法所在的类必须是public
     方法本身必须是public,而且是无参无返回值的,非静态的
    @Before
     加在需要在单元测试方法前面运行的方法上
     并且有要求:方法所在的类必须是public
     方法本身必须是public,而且是无参无返回值的,非静态的
     执行的特点:每一个@Test方法前面都会执行
    @BeforeClass
     加在需要在类初始化时执行的方法上
     并且有要求:方法所在的类必须是public
    方法本身必须是public,而且是无参无返回值的,静态的
   @AfterClass
    加在需要在类所有的测试方法之后执行的方法上
    并且有要求:方法所在的类必须是public
   方法本身必须是public,而且是无参无返回值的,静态的

四、自定义注解
    1、语法格式:
    【修饰符】 @interface 注解名{
      }
   2、加元注解说明一下
      元注解:注解注解的注解,给注解加的注解。它们在java.lang.annotation包下
  (1)@Target
       @Target(ElementType.xx)
       @Target({ElementType.xx,ElementType.xx,...})
       ElementType是一个枚举类型,有很多常量对象:例如:TYPE,METHOD,FIELD,CONSTRUCTOR....
       @Target作用:限制自定义的注解的使用的目标位置

 (2)@Retention
     @Retention(RetentionPolicy.SOURCE):源代码阶段   该注解只能被编译器读取
     @Retention(RetentionPolicy.CLASS):字节码阶段  该注解只能被编译器和类加载器读取
     @Retention(RetentionPolicy.RUNTIME):运行时阶段  该注解可以在运行时仍然被读取
            SOURCE < CLASS < RUNTIME

     @Retention的作用:限制自定义注解的寿命,可以“滞留”到什么阶段
      RetentionPolicy也是枚举类型,常量对象只有三个:SOURCE,CLASS,RUNTIME
 (3)@Documented
        标记某个注解是否可以被javadoc读取到API中。
 (4)@Inherited
        标记某个注解是否可以被子类继承

自定义注解2
 1、语法格式:
   @元注解
   【修饰符】 @interface 注解名{
     }
   @元注解
   【修饰符】 @interface 注解名{
      配置参数
     }
   没有配置参数的注解:
   (1)@Override
   (2)@Deprecated
   (3)@Documented
   (4)@Inherited
   (5)@Test
  有配置参数的
  (1)@SuppressWarnings(xx)
  (2)@Target(xx)
  (3)@Retention(xx)
  (4)@WebServlet(xx)
  1、配置参数的声明
    (1)声明格式:
        数据类型  参数名();
    (2)配置参数在声明时,可以有默认值
       数据类型  参数名() default 默认值;
   (3)数据类型
      注解的配置参数的数据类型的要求:8种基本数据类型,4种引用数据类型(String,Class,枚举,注解

       可以是它们的数组类型,例如:int[],String[],枚举类型[]等
  2、如果有配置参数,在使用时
    (1) @注解名(参数名1 = 参数值1,参数名2 = 参数值2,。。。。)
    (2)如果这个注解只有一个配置参数,并且它的名字叫做value,那么可以省略value=
        换句话说,声明配置参数时,参数名首先考虑value
 3、读取配置参数值时,   变量 = 注解对象.参数名()
     回忆:default
       (1)switch
       (2)接口
       (3)注解配置参数的默认值
   数据类型:
    (1)数据类型有哪些:
    (2)变量的数据类型: 都可以
    (3)属性的数据类型什么要求: 都可以
    (4)形参的数据类型什么要求: 都可以
    (5)返回值类型的类型有什么要求: 都可以
    (6)switch(表达式)中表达式的类型要求:4种基本数据类型,2种引用数据类
    (7)注解的配置参数的数据类型的要求:8种基本数据类型,4种引用数据类型(String,Class,枚举,注解)
             可以是它们的数组类型,例如:int[],String[],枚举类型[]等

导包:
   (1)import 包.类名;
   (2)import 包.*;
   (3)import static 包.类名.静态成员;
   (4)import static 包.类名.*;
   (3)(4)就是静态导入,JDK1.5之后引入


 JDK1.5增加的:
   (1)foreach
   (2)枚举
   (3)注解
   (4)可变参数
   (5)静态导入 ....
 JDK1.8增加的:
     接口的默认方法和静态方法……

 

异常:程序大多数情况下是可以正常,正确的运行,但是有的时候因为一些不可控的因素,导致程序运行异常,中断。
         例如:复制文件时,因为目标盘空间不足
                    聊天功能时,因为网络中断
                    计算两个数的商,用户输入的除数为0     .....
Java中是如何处理异常?
   当某句代码发生异常时,程序会在这句代码处“停”下来,然后JVM(大多数是JVM,有的时候也可能是程序中自己new)
   会创建一个“合适类型的异常的对象”,并且“抛”出来,JVM会在该句代码的“外围”搜索是否有"try..catch"可以
   “捕获”这个异常,如果可以“捕获”那么程序从"try..catch"下面继续运行,如果没有找对应的"try..catch"
   或者先有的"try..catch"无法“捕获”,那么程序会把这个异常对象“抛”给“上级”,如果上级可以“捕获”,那么就从
   “上级”的"try..catch"下面继续运行,否则接着往上抛,一直到main,如果main也“捕获”不了,就挂了。

异常的类型:
    java.lang.Throwable:Throwable 类是 Java 语言中所有错误或异常的超类。
    (1)只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
    (2)只有此类或其子类之一才可以是 catch 子句中的参数类型。 
     “抛”:JVM抛,throw抛
     “抓,捕获”:catch
      两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。
      通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。  
  分为:
     Error:错误,严重的异常,用于指示合理的应用程序不应该试图捕获(catch)的严重问题。
        例如:VirtualMachineError的两个子类: OutOfMemoryError, StackOverflowError
     Exception:异常
         非受检异常/运行时异常:RuntimeException及其它的子类
         受检异常/编译时异常:除了运行时异常,剩下的都是编译时异常
         编译器在检查程序时,遇到你throw或throws出RuntimeException,编译器不会强制要求你编写try..catch或继续throws处理;
         编译器在检查程序时,遇到你throw或throws出非运行时异常,那么编译器会强制要求你编写try...catch或继续throws否则编译不通过。
 try...catch
    1、语法格式:
       try{
         可能发生异常的语句块;
         }catch(异常类型1  异常名){
         处理该异常的代码;
         }catch(异常类型2  异常名){
          处理该异常的代码;
         }catch(异常类型3  异常名){
         处理该异常的代码;
         }
          ....
 try..catch的执行过程:
  (1)如果try中的代码没有异常,那么try中的代码执行完,正常执行try..catch下面的代码
  (2)如果try中的代码发生异常,首先,try中发生异常那句代码  后面的代码是无法执行,其次,在try中抛出一个
     异常对象,catch会按从上到下,依次尝试“捕获”,如果有一个“捕获”了,下面的catch就不看。
     所有要求子异常类型写上面,父异常类型写下面。
  (3)如果try中的代码发生异常,并且所有的catch都没有“捕获”,那么try..catch下面的代码就无法执行了,
          会把异常对象抛出“上级——调用者”,如果已经是最上级(main),就挂了。
          这个特点有的像:if...else if....
           提示:把字符串类型的数字转成int的值Integer.parseInt(字符串)

try...catch...finally
    语法格式:
     try{ 

        可能发生异常的语句块;
        }catch(异常类型1  异常名){
        处理该异常的代码;
       }catch(异常类型2  异常名){
        处理该异常的代码;
      }catch(异常类型3  异常名){
        处理该异常的代码;
      }
      ....
     finally{
        无论try中是否发生异常,也不管catch是否能够捕获异常,finally中一定要执行。
         }
       finally块中一般编写:释放资源,断开连接等代码。
        面试题:final,finally,finalize的区别?
                      final是修饰符,修饰类,表示不能被继承,修饰方法,表示不能被重写,修饰变量,表示值不能被修改。
                      finally:无论try中是否发生异常,也不管catch是否能够捕获异常,finally中一定要执行
                      finalize:是一个方法名,在Object类中,表示当对象被“垃圾回收器”回收之前调用,只调用一次。
    形式:
       try..catch
       try..finally
       try..catch...finally

throws:
   1、用于在声明方法时,显式的声明当前方法中没有处理的异常,要调用者来处理。
        调用者在使用有throws的方法时,用try...catch就知道该catch什么更具体异常,否则就按Exception
   2、语法格式:
      【修饰符】 返回值类型  方法名(【形参列表】)throws 异常列表{
       }
      异常列表可以写好几个,用,分割
   3、关于方法重写
    (1)方法名和形参列表必须相同
    (2)返回值类型
           基本数据类型和void:必须一致
          引用数据类型:<=   子类重写方法的返回值类型<=父类被重写方法的返回值类型
   (3)权限修饰符:>= 子类重写方法的权限修饰符的可见性范围 >= 父类被重写方法的权限修饰符的可见性范围 
   (4)其他修饰符: 哪些不能重写  static,final,private
   (5)抛出的异常列表的类型:<=  子类重写方法抛出的异常类型 <= 父类被重写方法抛出的异常类型

  大多数异常对象是JVM根据情况抛出。有的时候需要手动抛出异常,
     throw:用于手动抛出异常对象
     语法结构:
        throw 异常对象;
        可以代替return语句,即带回异常信息,而且可以结束方法的执行

自定义异常:
   (1)要继承Throwable或它子类
       一般都继承Exception(编译时异常),或者RuntimeException(运行时异常)
   (2) 异常名要见名知意
   (3)尽量保留父类的两个构造器:一个是无参构造,一个是为message赋值的构造器
   (4)自定义异常必须手动用throw来抛出,JVM无法给你自动抛出
 一个异常:
   (1)类型要见名知意
      例如:ArrayIndexOutOfBoundsException
                ClassCastException
                FileNotFoundException
  (2)自己的message消息
           异常对象名.getMessage()可以获取
  (3)堆栈跟踪信息
           异常对象经历的抛出路线,从哪个方法到哪个方法
           异常对象名.printStackTrace();  //Trace痕迹
           System.err:异常信息,默认是红色的
           System.out:普通信息
           System.err和System.out是两个线程,谁先抢到谁先打印

posted @ 2019-09-28 10:32  zzz222zzz  阅读(254)  评论(0编辑  收藏  举报