代码流程控制

if语句结构

if语句结构的最简形式如下。

Java
if (<条件>) {
<语句块>
}

其中,当<条件>的结果为true值时,执行<语句块>。下面的代码演示了此结构的应用。

Java
public class Hello {
	public static void main(String[] args) {
		int year = 2020;
		if((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) {
			System.out.printf("%d 年是闰年", year);
		}
	}
}

代码执行结果如下图。

那么,不是闰年时是不也要显示信息呢?可以添加else语句部分,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		int year = 2019;
		if((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) {
			System.out.printf("%d 年是闰年", year);
		} 
		else {
			System.out.printf("%d 年不是闰年", year);
		}
	}
}

代码执行结果如下图。

此外,在if和else之间,还可以添加一个或多个elseif部分,以判断更多的条件,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		int dir = 1;
		if(dir==1) {
			System.out.println("北");
		} 
		else if (dir==2) {
			System.out.println("东");
		}
		else if (dir==3) {
			System.out.println("南");
		} 
		else if (dir==4) { 
			System.out.println("西");
		} 
		else {
			System.out.println("未知方向");
		}
	}
}

执行代码会显示“北”,大家可修改dir变量的值来观察执行结果。

?:运算符

?:运算符可以看作if...else...语句结构的简写形式,其应用格式如下:

Java
x ? y : z

当x的值为true时,表达式返回y的值,当x的值为false时表达式返回z的值。下面的代码演示了?:运算符的应用。

Java
public class Hello {
	public static void main(String[] args) {
		int year = 2019;
		boolean isLeapYear = 
				(year % 400 == 0) || (year % 100 != 0 && year % 4 == 0);
		System.out.printf("%d %s 闰年",year,isLeapYear?"是":"不是");
	}
}

代码执行结果如下图。

switch语句结构

switch语句结构用于处理同一变量或表达式的不同值,其中,每一个值都应使用一个case语句来处理,同时,可以使用default语句值列表之外的情况。

条件变量或表达式中,可以使用的数据类型包括char、byte、short、int和枚举;当case处理一种情况时,应使用break语句作为结束,如下面的代码,我们使用switch语句重写方向的判断。

Java
public class Hello {
	public static void main(String[] args) {
		int dir = 1;
		switch(dir) {
			case 1:
				System.out.println("北");
				break;
			case 2:
				System.out.println("东");
				break;
			case 3:
				System.out.println("南");
				break;
			case 4: 
				System.out.println("西");
				break;
			default:
				System.out.println("未知方向");
				break;
		}
	}
}

如果多个值需要使用相同的处理代码,可以利用case语句的贯穿功能,即在case语句中不添加执行代码和break语句,此时,就会向下执行case语句,直到有结束语句(如break、return等)。

下面的代码,我们使用case语句的贯穿特性来判断某年某月有多少天。

Java
public class Hello {
	public static void main(String[] args) {
		int year = 2020;
		int month = 2;
		int daysInMonth = 0;
		boolean isLeapYear = 
				(year % 400 == 0) || (year % 100 != 0 && year % 4 ==0);
		switch(month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				daysInMonth = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				daysInMonth = 30;
				break;
			case 2:
				daysInMonth = isLeapYear?29:28;
				break;
			default:
				daysInMonth = 0;
				break;
		}
		System.out.printf("%d年%d月有%d天",year,month,daysInMonth);
	}
}

代码执行结果如下图。

for语句结构

for语句结构一般用于可确定执行次数的循环控制,其基本应用格式如下。

Java
for (<循环控制变量初始化> ; <条件>; <循环控制变量改变>) {
<语句块>
}

如下面的代码用于计算1到100的和。

Java
public class Hello {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=0; i<=100; i++) {
			sum = sum + i;
		}
		System.out.println(sum);
	}
}

执行代码显示5050。

灵活应用循环控制变量的改变规则,还可以简化一些工作,如下面的代码就是计算2到100的偶数和。

Java
public class Hello {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=2; i<=100; i=i+2) {
			sum = sum + i;
		}
		System.out.println(sum);
	}
}

执行代码会显示2550。

for语句还有一种变形,可以方便的访问数组或集合中的所有成员,下面先看一个简单的例子,后续课程中还会有数组和集合应用的详细讨论。

Java
public class Hello {
	public static void main(String[] args) {
		int[] arr = new int[] {1,2,3,4,5};
		for(int i : arr) {
			System.out.println(i);
		}
	}
}

代码执行结果如下图。

本例中,首先定义了数组arr,其成员类型为int;在for语句中,变量i表示数组成员,使用:运算符指定其遍历数组arr的所有成员,并在循环语句块中显示了数组成员的值。

标签

Java中没有goto语句,代码中如果需要快速跳出多重循环,可以配合break语句和标签。

Java中,可以为语句结构标签,相当于定义了一个命名语句结构,然后,可以通过break语句快速跳出此结构,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
	tag_greater_150:for(int i=0;i<100;i++) {
			for(int j=0;j<100;j++) {
				for(int k=0;k<100;k++) {
					int sum = i+j+k;
					if(sum>150) {
						System.out.printf("%d+%d+%d=%d",i,j,k,sum);
						break tag_greater_150;
					}
				}
			}
		}
	}
}

代码执行结果如下图。

continue语句

continue语句在循环语句结构中的功能就是中断本次循环,并开始下一次循环(如果条件满足),如下面的代码,我们利用continue语句来计算1到100中的偶数之和。

Java
public class Hello {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=0; i<=100; i++) {
			if(i%2!=0) continue;
			else sum = sum + i;
		}
		System.out.println(sum);
	}
}

代码执行显示2550。

while语句结构

while语句结构的应用格式如下。

Java
while(<条件>) {
<语句块>
}

结构中,当<条件>成立时(true),执行<语句块>,当<条件>不成立时(false),终止循环;下面的代码,我们使用while语句结构执行1到100的累加操作。

Java
public class Hello {
	public static void main(String[] args) {
		int sum = 0;
		int i = 1;
		while(i<=100) {
			sum = sum + i;
			i++;
		}
		System.out.println(sum);
	}
}

执行代码显示5050。

do...while语句结构

do...while语句结构与while相似,只是判断<条件>的位置不同;do...while语句结构的应用格式如下。

Java
do {
<语句块>
}while(<条件>);

如下面的代码,我们通过do...while语句结构计算2到100的偶数之和。

Java
public class Hello {
	public static void main(String[] args) {
		int sum = 0;
		int i = 2;
		do{
			sum = sum + i;
			i = i + 2;
		}while(i<=100);
		System.out.println(sum);
	}
}

执行代码会显示2550。

实际应用中,do...while语句会在每次执行循环语句后判断条件,有时,这样会有一些完全隐患,如果没有特殊要求,我们更建议使用while语句结构,即在每次执行循环语句之前进行条件判断。

异常处理

即使我们能保证代码的健壮,也不能保证外部资源绝对的正确;能够处理应用执行过程中的未知错误,即能保证应用执行的正确性,也可以给用户以良好的映像。

Java中,可以使用try...catch...finally语句结构来处理可能的异常情况。首先,在try语句块中定义可能会出现异常的代码,然后,可以在一系列的catch语句块中处理已知或未知的异常类型;最后,无论代码是否出现异常,都可以在finally语句块中进行最终的处理工作。

下面的代码,我们来看看整数除0异常的信息。

Java
public class Hello {
	public static void main(String[] args) {
		try {
			int x = 10;
			int result = x / 0;
			System.out.println(result);
		} catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

代码执行结果如下图。

实际应用中,可以使用多个catch语句块来处理具体的异常类型。如果无法处理异常,可以使用throw语句向代码的上一层抛出异常,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		try {
			int x = 10;
			int result = x / 0;
			System.out.println(result);
		} catch(Exception e) {
			throw e;
		}
	}
}

本例,我们在main()方法中抛出的异常,其上层就是操作系统了,所以,执行代码会直接显示异常,如下图。

无论代码是否出现异常,finally语句块都可以执行,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		try {
			int x = 10;
			int result = x / 0;
			System.out.println(result);
		} catch(Exception e) {
			throw e;
		} finally {
			System.out.println("程序结束");
		}
	}
}

代码执行结果如下图。

断言(assert)

在代码中添加断言,可以对程序的执行进行分段检测,以判断数据是否达到预期的结果。Java中,使用assert语句添加断言,主要包括以下两个格式:

  • assert <条件>;,当<条件>的结果为false时,会抛出AssertionError异常。
  • assert <条件> : <表达式>;,当<条件>的结果为false时,抛出AssertionError异常,并将<表达式>的结果传递到异常中。

下面的代码,我们使用断言来判断年龄是否在允许的范围内。

Java
public class Hello {
	public static void main(String[] args) {
		int age = -1;
		assert age>=0 && age<=150 : "年龄数据不正确";
		System.out.println(age);
	}
}

默认情况下,断言功能是关闭的,如果启动断言,可以在执行程序时使用-ea参数;测试时,可能通过Eclipse开发环境菜单“File”>>“Properties”打开属性设置窗口,如下图。

在VM参数中设置-ea,如下图。

然后单击“Apply”按钮保存设置。执行代码结果如下图。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc001006