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是两个线程,谁先抢到谁先打印