JAVA(1)【基础语法】Java中的基本语句

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 子句,它的参数要和异常对象的类型相同,或者是这个类型的子类。

  1. 如果 try 块抛出了异常,而且有处理该异常的 catch 块,那么先执行 catch 块,然后再执行 finally 块。如果本地没有能处理该异常的 catch 块,先执行 finally 块,然后再向上冒泡到能处理该异常最近的 catch 子句

  2. 如果 finally 块使用 return、continue、break 或 throw 语句,或者调用的方法抛出了异常,从而转移了控制权,那么待转移的控制权中止,改为执行新的控制权转移。例如,如果 finally 子句抛出了异常,这个异常会取代任何正在抛出的异常。如果 finally 子句使用了 return 语句,就算抛出的异常还没处理,方法也会正常返回。

  3. 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

posted @ 2021-08-04 09:07  小拙  阅读(828)  评论(0编辑  收藏  举报