零、关键字一览:
abstract continue for new switch
assert*** default goto* package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum**** instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp** volatile
const* float native super while
注:
- not used
** added in 1.2
*** added in 1.4
**** added in 5.0
说明:
Java中 true、false、null不是关键字,也不是保留字,是显式常量值,在程序中不能使用它们作为标识符。
一、 全部关键字-50个
1 abstract //抽象方法,抽象类的修饰符
2 assert //断言条件是否满足
3 boolean //布尔数据类型
4 break //跳出循环或者label代码段
*5 byte //8-bit 有符号数据类型
6 case //switch语句的一个条件
7 catch //和try搭配捕捉异常信息
8 char //16-bit Unicode字符数据类型
9 class //定义类
10 const //未使用
11 continue //不执行循环体剩余部分
12 default //switch语句中的默认分支
13 do //循环语句,循环体至少会执行一次
14 double //64-bit双精度浮点数
15 else //if条件不成立时执行的分支
16 enum //枚举类型
17 extends //表示一个类是另一个类的子类
18 final //表示一个值在初始化之后就不能再改变了
//表示方法不能被重写,或者一个类不能有子类
19 finally //try 语句不管是否发生异常都要执行的语句块
20 float //32-bit单精度浮点数
21 for //for循环语句
22 goto //未使用
23 if //条件语句
24 implements //表示一个类实现了接口
25 import //导入类
26 instanceof //测试一个对象是否是某个类的实例
27 int //32位整型数
28 interface //接口,一种抽象的类型,仅有方法和常量的定义
29 long //64位整型数
30 native //表示方法用非java代码实现
31 new //创建新的类实例并分配内存
32 package //一系列相关类组成一个包
33 private //表示私有字段,或者方法等,只能从类内部访问
34 protected //表示字段只能通过类或者其子类访问
//子类或者在同一个包内的其他类
35 public //表示共有属性或者方法
36 return //方法返回值
37 short //16位数字
38 static //表示在类级别定义,所有实例共享的
39 strictfp //浮点数比较使用严格的规则
40 super //表示基类
41 switch //选择语句
42 synchronized //表示同一时间只能由一个线程访问的代码块
43 this //表示调用当前实例
//或者调用另一个构造函数
44 throw //抛出异常
45 throws //定义方法可能抛出的异常
46 transient //修饰不要序列化的字段
47 try //表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码
48 void //标记方法不返回任何值
49 volatile //标记字段可能会被多个线程同时访问,而不做同步
50 while //while循环
二、 关键字分类-10类
1、数据类型-10个
byte 字节型
int 整型
long 长整型
short 短整型
double 双精度浮点型
float 单精度浮点型
char 字符型
boolean 布尔型
值只能是true和false,而不能用0和1代替,并且一定要小写。
void 空类型
enum 枚举类型
2、流程控制-12个
break 中断switch语句的执行
在循环语句中,同样也是结束循环语句的执行。
break完全跳出所在或者是所标记的循环。
continue 只跳出本次循环,还要继续执行下一次的循环。
if 分支结构if
else 分支结构else
switch 多重分支结构switch
case 多重分支结构case
default 多重分支结构default
for 循环结构for
while 循环结构whiel
do 循环结构do…while
return 方法返回语句
goto 跳转语句,表示跳转到指定的标号语句,保留字,不推荐使用
3、类和接口-4个
class 类
interface 接口
extends 继承
implements 实现
4、包相关-2个
package 打包,声明文件中所定义的类属于哪一个包
import 导入
5、访问修饰符-3个
private 私有地
在模块级别中使用,用于声明私有变量及分配存储空间。
默认访问控制 (package )
如果在成员变量和方法前不加任何访问权限修饰符
称为默认访问控制,也称为包访问控制。
同一包内的其他所有类都能访问该成员
但对包外的所有类就不能访问。
protected 表明被它修饰的成员变量为保护类型
在同一个包里和 public 类型是一样的,也是能够访问到的。
在不同包里的 protected 类型的成员变量只能通过子类来访问
这个修饰符是区别于其他的修饰符的。
public 公共的,表示某个变量或者函数是全局的
6、类,方法和变量修饰符-9个
strictfp 用于标记类、接口或方法
表明该类、接口、方法代码(含嵌套类型中的初始值和代码)
中所有的float和double表达式都严格遵守FP-strict的限制
符合IEEE-754规范
abstract 标记为抽象类或抽象方法
final 标记最终类或最终方法或最终属性
static 标记静态属性、静态方法、静态代码块
native 标记本地方法
synchronized 标记线程同步方法
transient 当串行化某个对象时,其中transient的变量不会被串行化
volatile 标记为volatile的变量可能会被意想不到地改变
编译器不会去假设这个变量的值
优化器在用到这个变量时必须每次都重新读取这个变量的值
而不是使用保存在寄存器里的备份。
const 保留字,标记常态的变量,可用final替代
7、类实例-3个
new 创建一个新的对象实例
指定一个可以用来创建实例的已定义类
可以在声明语句或赋值语句中使用 new
将调用指定类的构造函数,传递提供的所有参数。
this 引用当前类实例的属性、方法、构造方法
super 引用父类实例的属性、方法、构造方法
8、异常处理-5个
throws 定义方法可能抛出的异常
在方法头声明,throws后不允许有其他的语句
方法中发生异常但没有捕获,由方法调用者处理。
try try子句括起可能发生异常的代码
其中代码发生异常后终止程序的运行,跳转catch子句来执行
catch 捕获错误的语句
finally 为了完成执行的代码而设计的
为了程序的健壮性和完整性
无论有没有异常发生都执行其中的代码
throw 抛出异常语句
9、运算符-1个
instanceof 判断变量、常量属于哪个类的类型
10、断言-1个
assert 断言条件说明
三、 详细说明:
1、基本类型
-
boolean 布尔型
boolean 是 Java 原始类型。boolean 变量的值可以是 true 或 false。
boolean 变量只能以 true 或 false 作为值。boolean 不能与数字类型相互转换。
包含 boolean 操作数的表达式只能包含 boolean 操作数。
Boolean 类是 boolean 原始类型的包装对象类。 -
byte 字节型
byte 是 Java 原始类型。byte 可存储在 [-128, 127] 范围以内的整数值。
Byte 类是 byte 原始类型的包装对象类。它定义代表此类型的值的范围的 MIN_VALUE 和 MAX_VALUE 常量。
Java 中的所有整数值都是 32 位的 int 值,除非值后面有 l 或 L(如 235L),这表示该值应解释为 long。 -
char 字符型
char 是 Java 原始类型。char 变量可以存储一个 Unicode 字符。
可以使用下列 char 常量:\b - 空格, \f - 换页, \n - 换行, \r - 回车, \t - 水平制表符, ’ - 单引号, " - 双引号, \ - 反斜杠, \xxx - 采用 xxx 编码的 Latin-1 字符。\x 和 \xx 均为合法形式,但可能引起混淆。 \uxxxx - 采用十六进制编码 xxxx 的 Unicode 字符。
Character 类包含一些可用来处理 char 变量的 static 方法,这些方法包括 isDigit()、isLetter()、isWhitespace() 和 toUpperCase()。
char 值没有符号。 -
double 双精度
double 是 Java 原始类型。double 变量可以存储双精度浮点值。
由于浮点数据类型是实际数值的近似值,因此,一般不要对浮点数值进行是否相等的比较。
Java 浮点数值可代表无穷大和 NaN(非数值)。Double 包装对象类用来定义常量 MIN_VALUE、MAX_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY 和 NaN。 -
float 浮点
float 是 Java 原始类型。float 变量可以存储单精度浮点值。
使用此关键字时应遵循下列规则:
Java 中的浮点文字始终默认为双精度。要指定单精度文字值,应在数值后加上 f 或 F,如 0.01f。
由于浮点数据类型是实际数值的近似值,因此,一般不要对浮点数值进行是否相等的比较。
Java 浮点数值可代表无穷大和 NaN(非数值)。Float 包装对象类用来定义常量 MIN_VALUE、MAX_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY 和 NaN。 -
int 整型
int 是 Java 原始类型。int 变量可以存储 32 位的整数值。
Integer 类是 int 原始类型的包装对象类。它定义代表此类型的值的范围的 MIN_VALUE 和 MAX_VALUE 常量。
Java 中的所有整数值都是 32 位的 int 值,除非值后面有 l 或 L(如 235L),这表示该值应解释为 long。 -
long 长整型
long 是 Java 原始类型。long 变量可以存储 64 位的带符号整数。
Long 类是 long 原始类型的包装对象类。它定义代表此类型的值的范围的 MIN_VALUE 和 MAX_VALUE 常量。
Java 中的所有整数值都是 32 位的 int 值,除非值后面有 l 或 L(如 235L),这表示该值应解释为 long。 -
short 短整型
short 是 Java 原始类型。short 变量可以存储 16 位带符号的整数。
Short 类是 short 原始类型的包装对象类。它定义代表此类型的值的范围的 MIN_VALUE 和 MAX_VALUE 常量。
Java 中的所有整数值都是 32 位的 int 值,除非值后面有 l 或 L(如 235L),这表示该值应解释为 long。 -
void 无返回值
void 关键字表示 null 类型。
void 可以用作方法的返回类型,以指示该方法不返回值。 -
enum 枚举类型
***显示常量
11) null 空
null 是 Java 的保留字,表示无值。
将 null 赋给非原始变量相当于释放该变量先前所引用的对象。
不能将 null 赋给原始类型(byte、short、int、long、char、float、double、boolean)变量。
11) true 真
true 关键字表示 boolean 变量的两个合法值中的一个。
12) false 假
false 关键字代表 boolean 变量的两个合法值之一。
2、流程控制
-
break 跳出,中断
break 关键字用于提前退出 for、while 或 do 循环,或者在 switch 语句中用来结束 case 块。
break 总是退出最深层的 while、for、do 或 switch 语句。 -
continue 继续
continue 关键字用来跳转到 for、while 或 do 循环的下一个迭代。
continue 总是跳到最深层 while、for 或 do 语句的下一个迭代。 -
return 返回
return 关键字会导致方法返回到调用它的方法,从而传递与返回方法的返回类型匹配的值。
如果方法具有非 void 的返回类型,return 语句必须具有相同或兼容类型的参数。
返回值两侧的括号是可选的。 -
do 运行
do 关键字用于指定一个在每次迭代结束时检查其条件的循环。
do 循环体至少执行一次。
条件表达式后面必须有分号。 -
while 循环
while 关键字用于指定一个只要条件为真就会重复的循环。 -
if 如果
if 关键字指示有条件地执行代码块。条件的计算结果必须是布尔值。
if 语句可以有可选的 else 子句,该子句包含条件为 false 时将执行的代码。
包含 boolean 操作数的表达式只能包含 boolean 操作数。 -
else 否则
else 关键字总是在 if-else 语句中与 if 关键字结合使用。else 子句是可选的,如果 if 条件为 false,则执行该子句。 -
for 循环
for 关键字用于指定一个在每次迭代结束前检查其条件的循环。
for 语句的形式为 for(initialize; condition; increment)
控件流进入 for 语句时,将执行一次 initialize 语句。
每次执行循环体之前将计算 condition 的结果。如果 condition 为 true,则执行循环体。
每次执行循环体之后,在计算下一个迭代的 condition 之前,将执行 increment 语句。 -
switch 观察
switch 语句用于基于某个表达式选择执行多个代码块中的某一个。
switch 条件的计算结果必须等于 byte、char、short 或 int。
case 块没有隐式结束点。break 语句通常在每个 case 块末尾使用,用于退出 switch 语句。
如果没有 break 语句,执行流将进入所有后面的 case 和/或 default 块。 -
case 返回观察里的结果
case 用来标记 switch 语句中的每个分支。
case 块没有隐式结束点。break 语句通常在每个 case 块末尾使用,用于退出 switch 语句。
如果没有 break 语句,执行流将进入所有后面的 case 和/或 default 块。 -
default 默认
default 关键字用来标记 switch 语句中的默认分支。
default 块没有隐式结束点。break 语句通常在每个 case 或 default 块的末尾使用,以便在完成块时退出 switch 语句。
如果没有 default 语句,其参数与任何 case 块都不匹配的 switch 语句将不执行任何操作。 -
goto 跳转
goto 保留关键字,但无任何作用。结构化程序设计完全不需要 goto 语句即可完成各种流程,而 goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。
3、类和接口
-
class类
class 关键字用来声明新的 Java 类,该类是相关变量和/或方法的集合。类是面向对象的程序设计方法的基本构造单位。类通常代表某种实际实体,如几何形状或人。类是对象的模板。每个对象都是类的一个实例。要使用类,通常使用 new 操作符将类的对象实例化,然后调用类的方法来访问类的功能。 -
interface 接口
interface 关键字用来声明新的 Java 接口,接口是方法的集合。
接口是 Java 语言的一项强大功能。任何类都可声明它实现一个或多个接口,这意味着它实现了在这些接口中所定义的所有方法。
实现了接口的任何类都必须提供在该接口中的所有方法的实现。一个类可以实现多个接口。 -
extends 继承、扩展
extends 关键字用在 class 或 interface 声明中,用于指示所声明的类或接口是其名称后跟有 extends 关键字的类或接口的子类。子类继承父类的所有 public 和 protected 变量和方法。 子类可以重写父类的任何非 final 方法。一个类只能扩展一个其他类。 -
implements实现
implements 关键字在 class 声明中使用,以指示所声明的类提供了在 implements 关键字后面的名称所指定的接口中所声明的所有方法的实现。类必须提供在接口中所声明的所有方法的实现。一个类可以实现多个接口。
4、包相关 -
import 引入
import 关键字使一个包中的一个或所有类在当前 Java 源文件中可见。可以不使用完全限定的类名来引用导入的类。
当多个包包含同名的类时,许多 Java 程序员只使用特定的 import 语句(没有“*”)来避免不确定性。 -
package 包
package 关键字指定在 Java 源文件中声明的类所驻留的 Java 包。
package 语句(如果出现)必须是 Java 源文件中的第一个非注释性文本。
例:java.lang.Object。
如果 Java 源文件不包含 package 语句,在该文件中定义的类将位于“默认包”中。请注意,不能从非默认包中的类引用默认包中的类。
5、访问修饰符-访问控制
- private 私有的
private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。 只能在声明 private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 - protected 受保护的
protected 关键字是可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。可以在声明 protected 类、方法或字段的类、同一个包中的其他任何类以及任何子类(无论子类是在哪个包中声明的)中引用这些类、方法或字段。所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 - public 公共的
public 关键字是可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。 可能只会在其他任何类或包中引用 public 类、方法或字段。所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。
6、类,方法和变量修饰符
-
abstract 声明抽象
abstract关键字可以修改类或方法。abstract类可以扩展(增加子类),但不能直接实例化。abstract方法不在声明它的类中实现,但必须在某个子类中重写。采用 abstract方法的类本来就是抽象类,并且必须声明为abstract。 -
final 最终、不可改变
final 关键字可以应用于类,以指示不能扩展该类(不能有子类)。final 关键字可以应用于方法,以指示在子类中不能重写此方法。一个类不能同时是 abstract 又是 final。abstract 意味着必须扩展类,final 意味着不能扩展类。一个方法不能同时是 abstract 又是 final。abstract 意味着必须重写方法,final 意味着不能重写方法。 -
native 本地
native 关键字可以应用于方法,以指示该方法是用 Java 以外的语言实现的。
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 -
static 静态
static 关键字可以应用于内部类(在另一个类中定义的类)、方法或字段(类的成员变量)。
通常,static 关键字意味着应用它的实体在声明该实体的类的任何特定实例外部可用。
static(内部)类可以被其他类实例化和引用(即使它是顶级类)。在上面的示例中,另一个类中的代码可以实例化 MyStaticClass 类,方法是用包含它的类名来限定其名称,如 MyClass.MyStaticClass。
static 字段(类的成员变量)在类的所有实例中只存在一次。
可以从类的外部调用 static 方法,而不用首先实例化该类。这样的引用始终包括类名作为方法调用的限定符。
模式:public final static varName = ; 通常用于声明可以在类的外部使用的类常量。在引用这样的类常量时需要用类名加以限定。在上面的示例中,另一个类可以用 MyClass.MAX_OBJECTS 形式来引用 MAX_OBJECTS 常量。 -
strictfp 严格,精准
strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令人满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果想让浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字 -
synchronized线程、同步
synchronized 关键字可以应用于方法或语句块,并为一次只应由一个线程执行的关键代码段提供保护。
synchronized 关键字可防止代码的关键代码段一次被多个线程执行。
如果应用于静态方法,那么,当该方法一次由一个线程执行时,整个类将被锁定。
如果应用于实例方法,那么,当该方法一次由一个线程访问时,该实例将被锁定。
如果应用于对象或数组,当关联的代码块一次由一个线程执行时,对象或数组将被锁定。 -
transient 短暂
transient 关键字可以应用于类的成员变量,以便指出该成员变量不应在包含它的类实例已序列化时被序列化。
当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。 -
volatile 易失
volatile 关键字用于表示可以被多个线程异步修改的成员变量。
注意:volatile 关键字在许多 Java 虚拟机中都没有实现。 volatile 的目标用途是为了确保所有线程所看到的指定变量的值都是相同的。
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。 -
const 静态
const 保留字,是一个类型修饰符,使用const声明的对象不能更新。与final某些类似。
7、类实例
- new 新,创建
new 关键字用于创建类的新实例。
new 关键字后面的参数必须是类名,并且类名的后面必须是一组构造方法参数(必须带括号)。
参数集合必须与类的构造方法的签名匹配。
= 左侧的变量的类型必须与要实例化的类或接口具有赋值兼容关系。 - super 父类,超类
super 关键字用于引用使用该关键字的类的超类。
作为独立语句出现的 super 表示调用超类的构造方法。
super.() 表示调用超类的方法。只有在如下情况中才需要采用这种用法:要调用在该类中被重写的方法,以便指定应当调用在超类中的该方法。 - this 本类
this 关键字用于引用当前实例。
当引用可能不明确时,可以使用 this 关键字来引用当前的实例。
8、异常处理
-
try 捕获异常
try 关键字用于包含可能引发异常的语句块。
每个 try 块都必须至少有一个 catch 或 finally 子句。
如果某个特定异常类未被任何 catch 子句处理,该异常将沿着调用栈递归地传播到下一个封闭 try 块。如果任何封闭 try 块都未捕获到异常,Java 解释器将退出,并显示错误消息和堆栈跟踪信息。 -
catch 处理异常
catch 关键字用来在 try-catch 或 try-catch-finally 语句中定义异常处理块。
开始和结束标记 { 和 } 是 catch 子句语法的一部分,即使该子句只包含一个语句,也不能省略这两个标记。
每个 try 块都必须至少有一个 catch 或 finally 子句。
如果某个特定异常类未被任何 catch 子句处理,该异常将沿着调用栈递归地传播到下一个封闭 try 块。如果任何封闭 try 块都未捕获到异常,Java 解释器将退出,并显示错误消息和堆栈跟踪信息。 -
finally
用来执行一段代码不管在前面定义的try语句中是否有异常或运行时错误发生。 -
throw 抛出一个异常对象
throw 关键字用于引发异常。
throw 语句将 java.lang.Throwable 作为参数。Throwable 在调用栈中向上传播,直到被适当的 catch 块捕获。
引发非 RuntimeException 异常的任何方法还必须在方法声明中使用 throws 修饰符来声明它引发的异常。 -
throws 声明一个异常可能被抛出
throws 关键字可以应用于方法,以便指出方法引发了特定类型的异常。
throws 关键字将逗号分隔的 java.lang.Throwables 列表作为参数。
引发非 RuntimeException 异常的任何方法还必须在方法声明中使用 throws 修饰符来声明它引发的异常。
要在 try-catch 块中包含带 throws 子句的方法的调用,必须提供该方法的调用者。
9、运算符
- instanceof 实例
instanceof 关键字用来确定对象所属的类。
10、断言
10.1. 语法表示
两种表达式,分别如下:
assert expression1;
assert expression1: expression2;
10.2. 语义含义
- 在运行时,如果关闭了assertion功能,这些语句将不起任何作用。
- 如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象;如果expression1值为true,expression2将不被计算。
- 一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。
10.3. 运行
- 这种程序必须在JDK1.4(或者更高版本)的JRE下运行。
- 参数 -esa和 -dsa:
它们含义为开启(关闭)系统类的assertion功能。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。 - 参数 -ea和 -ea:
它们含义为开启(关闭)用户类的assertion功能。
-ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。
下面表格表示了参数及其含义。
参数 例子 说明
-ea java -ea 打开所有用户类的assertion
-da java -da 关闭所有用户类的assertion
-ea: java -ea:MyClass1 打开MyClass1的assertion
-da: java -da: MyClass1 关闭MyClass1的assertion
-ea: java -ea:pkg1 打开pkg1包的assertion
-da: java -da:pkg1 关闭pkg1包的assertion
-ea:… java -ea:… 打开缺省包(无名包)的assertion
-da:… java -da:… 关闭缺省包(无名包)的assertion
-ea:… java -ea:pkg1… 打开pkg1包和其子包的assertion
-da:… java -da:pkg1… 关闭pkg1包和其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
其中…代表:此包和其子包的含义。例如有两个包为pkg1和pkg1.subpkg。那么pkg1…就代表pkg1和pkg1.subpkg两个包。
综合使用
java -dsa:MyClass1:pkg1
关闭MyClass1和pkg1包的assertion
10.4. Assert使用场合
10.4.1. 适宜使用场合
- 使用assert来检查private和protected函数中的参数预处理(preconditions)和后处理(postconditions)。
- 使用assert来检查参数或者变量的特殊值,一旦参数或者变量为这些特殊值,则跟这些参数有变量有关的操作不应该出现。
eg.
Object source = event.getSoure();
Assert(source != null);
…….
Int hc = source.hashCode();//一些使用source的代码
3. 使用assert来检查控制流(无效代码分支)。
eg.
If(source == yesBtn) {// do code
}
else If(source == noBtn) {// do code
}
else If(source == cancelBtn) {// do code
}
else {
assert false; "Invalid Source " +source.toString();
}
4. 使用assert来检查返回值(传递条件)。
Eg.
public Object someMedth() {
Object result = null;
…… //do some code that sets result
Asset(result !=null); // check post condition
return result;
}
10.4.2. 不适宜使用场合
- 不要在public函数中使用assert来验证参数。
这些函数应该抛出NullPointerException,IllegalArgumentException,或者其他相关的exception。 - 不要使用assert来检查软件用户的错误。应该抛出IllegalArgumentException。
- 不要使用assert来完成任何工作。如果使用了assert来完成一些功能,那么assertions一旦被关闭了怎么办?
- 不要无聊地将assert抛出的错误消息国际化。一旦assertions关闭,白做?