1. 循环语句
while()循环
do…while()循环
for(init ; test ; increment)
for(variable : iterable) 遍历语句
注:float和double类型的变量,不能作为循环语句的下标。否则,会导致死循环。
2. 条件语句
If...else...
switch(expr)
case expr:
注:
(1)if...else...条件语句中可以使用使用包装类Boolean代替基本类型boolean,java解释器在执行代码时会自拆箱。
(2)Switch语句支持的类型:
byte、char、short、int
Byte、Character、Short、Integer
Enum
String
(3)Switch语句的执行顺序:进入某个分支后,如何没有break语句,会持续执行后续挨着的case分支内容。【规范方式】若某分支真实意图就是不需要break,增加注释说明。
(4) 【规范方式】对于if-else if(后续可能有多个else if)类型的条件判断,建议后包含一个else分支。原因:多个else if条件组合的判断逻辑,往往会出现开发人员忽略的分支,需要设置else默认操作。
3. 标注语句
labelname: xxxxx
标注语句一般用于switch、和break语句中。如:
rowLoop: for(int r = 0; r < rows.length; r++) { // 一个标注循环
colLoop: for(int c = 0; c < columns.length; c++) { // 另一个
break rowLoop; // 使用标注
}
}
4. 局部变量声明语句
java语言中不允许使用未初始化的局部变量。一行可以声明多个变量,但是类型必须相同。
int i, j, k;
float x = 1.0, y = 1.0;
String question = "Really Quit?", response;
局部常量可以使用final关键字声明其为常量。
Java中任何位置都可以使用变量声明语句,而不用局向在方法或代码块的开头。
5. synchronized语句
在多线程编程中经常用到此语句。
synchronized ( expression ) {
statements
}
expression必须是一个对象或数组。能导致破坏的代码必须放到staements内。
执行语句块之前,java解释器限位expression计算得到的对象或数组获取一个排它锁(exclusive lock),只到语句执行完毕再释放。只要某个进程拥有某个对象的排它锁,其他线程就不能在获取这个锁。
synchronized也可作为方法的修饰符。应用方法时,此关键字指定整个方法都被锁定。如果 synchronized 关键字应用于类方法(静态方法),执行方法前,Java会先为这个类获取一个排它锁。如果synchronized关键字应用于实例方法,Java 为类的实例(对象)获取一个排它锁。
6. throw语句
异常是一种信号,表明发生了某种异常状况或错误。抛出异常的目的是发出信号,表示有异常状况发生。捕获异常的目的是处理异常,使用必要的操作修复。
throw expression;
expression 的计算结果必须是一个异常对象,说明发生了什么异常或错误。
Java 解释器执行 throw 语句时,会立即停止常规的程序执行,开始寻找能捕获或处理异常的异常处理程序。
(1)Java 解释器先在当前代码块中查找异常处理程序,如果有,解释器会退出这个代码块,开始执行异常处理代码。异常处理程序执行完毕后,解释器会继续执行处理程序后的语句。
(2)如果当前代码块中没有适当的异常处理程序,解释器会在外层代码块中寻找,直到找到为止。如果方法中没有能处理 throw 语句抛出的异常的异常处理程序,解释器会停止运行当前方法,返回调用这个方法的地方,开始在调用方法的代码块中寻找异常处理程序。Java 通过这种方式,通过方法的词法结构不断向上冒泡,顺着解释器的调用堆栈一直向上寻找。
(3)如果一直没有捕获异常,就会冒泡到程序的 main() 方法。如果在 main() 方法中也没有处理异常,Java 解释器会打印一个错误消息,还会打印一个堆栈跟踪,指明这个异常在哪里发生,然后退出。
7. try、catch、finally语句
Java 有两种稍微不同的异常处理机制。经典形式是使用 try/catch/finally 语句。
(1)这个语句的 try 子句是可能抛出异常的代码块。
(2)try 代码块后面是零个或多个 catch 子句,每个子句用于处理特定类型的异常,而且能处理多个不同类型的异常。如果 catch 块要处理多个异常,使用 | 符号分隔各个不同的异常。
(3)catch 子句后面是一个可选的 finally 块,包含清理代码,不管 try 块中发生了什么,始终都会执行。
catch 和 finally 子句都是可选的,但每个 try 块都必须有这两个子句中的一个。
try、 catch 和 finally 块都放在花括号里。花括号是句法必须的一部分,即使子句只包含一个语句也不能省略。
try {
// 正常情况下,这里的代码从上到下运行,没有问题。但是,有时可能抛出异常
// 可能是throw语句直接抛出
// 也可能是调用的方法间接抛出
} catch (SomeException e1) {
// 这段代码中的语句用于处理SomeException或其子类类型的异常对象
// 在这段代码中,可以使用名称e1引用那个异常对象
}
catch (AnotherException | YetAnotherException e2) { //参数为异常类型,必须为Throwable 的子类。
// 这段代码中的语句用于处理AnotherException、 YetAnotherException
// 或二者的子类类型的异常。在这段代码中,使用名称e2引用传入的异常对象
} finally {
// 不管try子句的结束方式如何,这段代码中的语句都会执行:
// 1)正常结束:到达块的末尾
// 2)由break、continue或return语句导致
// 3)抛出异常,由上述catch子句处理
// 4)抛出异常,未被捕获处理
// 但是,如果在try子句中调用了System.exit(),解释器会立即退出,不执行finally子句
}
有异常抛出时,Java 解释器会寻找一个 catch 子句,它的参数要和异常对象的类型相同,或者是这个类型的子类。
-
如果 try 块抛出了异常,而且有处理该异常的 catch 块,那么先执行 catch 块,然后再执行 finally 块。如果本地没有能处理该异常的 catch 块,先执行 finally 块,然后再向上冒泡到能处理该异常最近的 catch 子句。
-
如果 finally 块使用 return、continue、break 或 throw 语句,或者调用的方法抛出了异常,从而转移了控制权,那么待转移的控制权中止,改为执行新的控制权转移。例如,如果 finally 子句抛出了异常,这个异常会取代任何正在抛出的异常。如果 finally 子句使用了 return 语句,就算抛出的异常还没处理,方法也会正常返回。
-
try 和 finally 子句可以放在一起使用,不处理异常,也没有 catch 子句。此时, finally 块只是负责清理的代码,不管 try 子句中有没有 break、continue 或 return 语 句,都会执行。
8. 处理资源的try语句
Java 7开始提供了一种很有用的机制,能自动关闭需要清理的资源——处理资源 的 try 语句(try-with-resources,TWR)。
try (InputStream is = new FileInputStream("/Users/ben/details.txt")) {
// ……处理这个文件
}
这种新型 try 语句的参数都是需要清理的对象。这些对象的作用域在 try 块中,不管 try 块以何种方式退出,都会自动清理。开发者无需编写任何 catch 或 finally 块,Java 编译 器会自动插入正确的清理代码。
所有处理资源的新代码都应该使用 TWR 形式编写,因为这种形式比自己动手编写 catch 块更少出错,而且不会遇到麻烦的技术问题,例如终结。
9. assert语句
断言语句,由assert语句和boolean表达式组成。默认情况下断言未启用, assert 语句什么作用也没有。
不过,作为一种调试工具,可以启用断言。启用后,assert 语句会计算表达式。如果表达式的计算结果确是 true,assert 语句什么也不做;如果计算结果是 false,断言失败,assert 语句抛出 java.lang.AssertionError异常。
在JDK库外,很少使用assert语句,用其测试,大多数情况下是不起作用的。
assert assertion;
assert assertion : errorcode;
注意:绝不要在自己编写的代码中抛出 AssertionError 异常。
默认情况下,禁用断言,但是断言代码还是会被编译到类文件中,所以诊断或调试时可以启动断言。
断言可以全局启动,也可以在启动java解释器的参数中启动:
(1) 为系统类外的其他类启用断言,java 加上-ea参数
(2) 为系统类启用断言,java 加上-esa参数
(3) 为具体某个类启用断言,java加上-ea:包名+类名
(4) 为某个包的所有类启动断言,java加上-ea:包名…
(5) 禁用断言,参数为-da,使用方法类同-ea