1.使用if和switch语句编写代码
(1) If语句的唯一合法表达式是布尔表达式。即:只能是可以被解析为布尔值或布尔变量的表达式
(2) 一定要注意布尔赋值(=),它可能被错认为布尔相等性(==)测试:boolean x = false;if(x = true){}//an assignment, so x will always be true!
(3) 对于只有一个条件语句的if块来说,波形括号是可选的。但要注意缩进
(4) Switch语句只能计算枚举或byte、short、int和char数据类型.Notice:long类型,编译通不过
(5) Case常量必须是字面值或final变量,或者是常量表达式,包括枚举。不能在case中包含非final变量或一个取值范围
(6) 如果switch语句中的条件与一个case常量相匹配,则将运行switch内在这一匹配的case语句后的所有代码,直至遇到break语句,或者到达switch语句的末尾为止。即:相匹配的case只是这个case块的入口点,但除非有break语句,否则将执行的case代码并不只是这个相匹配的case
(7) 如果想在没有一个case值匹配条件值时执行一些代码,则应该在switch语句内使用default关键字
(8) Default块可以位于switch块内的任何地方,因此,如果没有case相匹配,则将进入default块。如果default不包含break,则代码将继续执行(直落)到switch的末尾,或者直到遇到break语句为止
2.使用循环编写代码
(1) 基本for语句包含3个部分:声明和/或初始化、布尔计算以及迭代表达式
(2) 如果在基本for循环内计算或者递增变量,则它必须在该循环之前或在for循环声明内声明
(3) 在基本for循环声明内声明(不只是初始化)的变量不能在for循环之外访问,即:for循环后面的代码不能使用该变量
(4) 在基本for循环声明的第一部分内能够初始化多个同类型的变量,每个初始化变量必须用逗号分隔
(5) 增强型for循环(Java6)有两个部分:声明(块变量,其类型与数组或集合的元素兼容,并且该变量包含给定迭代的元素的值)和表达式(你希望循环遍历的数组或集合)。它只用于循环遍历数组或集合
(6) 不能将数字或其它不能计算为布尔值的任何内容作为if语句或循环结构的条件。例如:不能将if语句写成if(x),除非x是布尔变量
(7) 即使测试条件不满足,do循环也至少将进入循环体一次
3.使用break和continue语句
(1) 无标签的break语句将停止最内层循环构造的当前迭代,并执行该循环之后的下一行代码
(2) 无标签的continue语句将导致:最内层循环构造的当前迭代停止,检查该循环的条件,如果条件满足,则再次运行该循环
(3) 若break/continue语句是带标签的,则它将在带标签的循环上引发类似的操作,而不是在最内层循环上
4.处理异常
(1) 异常有两种形式:检验异常和非检验异常
(2) 检验异常包括Exception的所有子类型,但不包括扩展RuntimeException的类
(3) 检验异常遵守处理或声明它的规则,任何可能抛出检验异常的方法(包括调用能够抛出检验异常方法的方法),都必须使用throws关键字声明异常,或用适当的try/catch处理异常
(4) Error或RuntimeException的子类型是非检验异常,因此,编译器不强迫要求处理或声明规则。你可以随意声明或处理它们,编译器对此不关心
(5) 若用可选的finally块,则始终会调用它,不管在相应的try内是否有异常抛出,也不管抛出的异常是否被捕获
(6) “始终调用finally”这一规则的唯一例外是:如果JVM关闭,则不会调用finally块。如果从try或catch块调用System.exit(),则会发生这种情况
(7) 调用finally并不意味着它必然完成。Finally块内的代码本身能够引发异常或者触发方法System.exit()
(8) 未捕获的异常通过调用栈向后传播,它从抛出该异常的方法开始,到具有该异常类型相应catch的第一个方法为止,或者到JVM关闭为止[如果该异常到达main(),并且main()声明它”躲避”该异常时,则JVM会关闭]
(9) 可创建自己的异常,通常通过扩展Exception或其子类型之一创建。这些异常将被看作检验异常,编译器将对这些异常强制执行处理或声明规则
(10) 所有的catch块都必须按照从最具体到最通用的顺序排列。如果对于IOException和Exception有一个catch子句,则必须把针对IOException的catch放在代码的前面。否则,IOException将被catch(Exception e)捕获,因为catch变元能够捕获这一特定的异常或其任何子类型。编译器将禁止定义从来不能到达的catch子句
(11) 有些异常时有程序员创建的,有些则是由JVM创建的
5.使用断言机制
(1) 断言为在开发和调试期间测试假设提供了一种办法
(2) 断言通常在测试期间启用,在部署期间禁用
(3) 可以将assert用作关键字(Java1.4起)或者标识符,但不能同时将它用作这两者。为了编译将assert用作标识符(例如,方法名称)的旧代码,应使用javac的命令行标志-source 1.3
(4) 默认情况下,断言在运行时是禁用的。要启用断言,应使用-ea或-enableassertions命令行标志
(5) 可以使用-da或-disableassertions标志有选择地禁用断言
(6) 可以使用不带任何变元的标识启用或禁用断言,则一般将启用或禁用断言。可以结合启用和禁用开关为某些类和/或包启用断言,而对其它类和/或包禁用
(7) 使用下面的方法能够以类为基础启用和禁用断言:java -ea -da:MyClass TestClass
(8) 可以以包为基础启用或禁用断言,指定的任何包也包含所有子包
(9) 不要使用断言验证公共方法的变元
(10) 不要使用可能产生副作用的断言表达式。
(11) 不要使用断言来验证某个代码快将永远不会到达。对于永远不应到达的代码,可以使用”assert false”,如果执行这条assert语句,则会立即抛出一个AssertionError.