在java中的控制语句有三种:分支语句、循环语句、跳转语句
分支语句:if和wsitch
循环语句:while、do -- while、for
跳转语句:break、continue、return、throw
1.分支语句
1.1 if语句
1.1.1 if结构:
if(条件表达式)//如果满足条件表达式执行语句组1,否则不执行
{
语句组 1
}
if结构例如:
int s=80;
if(s>60)
{
System.out.println("大于60");
}
输出结果:
大于60
1.1.2 if - else结构
if(条件表达式)//如果满足表达式执行语句组1,否则执行语句组2
{
语句组1
}
else
{
语句组2
}
if-else结构例如:
int sj=70;
if(sj>60)
{
System.out.println("及格");
}
else
{
System.out.println("不及格");
}
输出结果
及格
1.1.3 else-if结构
if(条件表达式1)
{
语句组1
}
else if(条件表达式2)
{
语句组2
}
…………
else if(条件表达式n)
{
语句组n
}
else
{
语句组n+1
}
else if结构是if-else结构de多重嵌套,特点是在这里只执行一个语句组,其他分支不执行。下面是else if结构的例子
int score=70;
if(score>=90)
{
System.out.println("优秀");
}
else if(score>=80)
{
System.out.println("中等");
}
else if(score>=70)
{
System.out.println("良好");
}
else if(score>=60)
{
System.out.println("及格");
}
else
{
System.out.println("不及格");
}
输出结果
良好
1.2 switch语句
switch()
{
case 值1:
语句组;1
case 值2:
语句组;2
case 值3:
语句组;3
……………
case 值n:
语句组;n
default:
语句组n+1
}
以判断月份的天数的题目作为下面的例题:
int mouth=7;
int year=2023;
switch(mouth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(year+"年"+mouth+"月有31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(year+"年"+mouth+"月有30天");
break;
case 2:
if(year%4==0 && year%100!=0 && year%400==0)
{
System.out.println(year+"年"+mouth+"月有29天");
}
else
{
System.out.println(year+"年"+mouth+"月有28天");
}
break;
}
2023年7月有31天
switch语句计算结果只能是int、short、byte、char、String类型,以及枚举类型,不能是上面的类型的其他类型。每个case的后面只能是int、short、byte、char、String类型,以及枚举类型的常量,default语句可以省略。
当执行switch语句时,语句组跳完不跳出switch语句,除了遇到break才能跳出switch语句。如果所有的case语句都没有执行,则执行default的语句组。
上面的例题代码中如果都没有break,则出现下面结果:
2023年7月有31天
2023年7月有30天
2023年7月有28天
这样的结果不符合我们需要的结果,所以在case的语句组后面加上break,在default的后面不用加上break,因为default就结束switch语句了,加不加上的结果都一样,符合语法。
2.循环语句
2.1while语句
while(循环条件)
{
语句组
}
while语句的应用
int i=0;
while(i*i<100000)
{
i++;
}
System.out.println("i="+i);
System.out.println("i*i="+(i*i));
输出结果
i = 317
i * i=100489
上面的代码目的是找到平方数小于100000的最大整数,while的条件表达式只能有一个表达式。循环体中需要循环变量,在while语句前必须对循环变量进行初始化,否则会进入死循环。
2.2do-while语句
do
{
语句组
}while(循环条件)
do-while语句的应用
int i=0;
do
{
i++;
}while(i*i<100000)
System.out.println("i="+i);
System.out.println("i*i="+(i*i));
输出结果
i = 317
i * i=100489
很显然,do-while的例子和上面的while的例子的输出一样,while和do-while的格式差不多。但是还是有区别的。while语句是先进行判断,在进行语句组。而do-while是先进行语句组,完成语句组再进行判断。所以得到一句话:while可能一次不循环,但do-while一定循环一次。
2.3 for语句
2.3.1 for语句
for语句是应用最广泛的、功能最强的一种循环语句,而且不容易死循环
for(初始化;循环条件;送代)
{
语句组
}
下面是1~9的平方表的for应用
for(int i=1;i<=9;i++)
{
System.out.println(i+"*"+i+"="+i*i);
}
输出结果
1*1=1
2*2=4
3*3=9
4*4=16
5*5=25
6*6=36
7*7=49
8*8=64
9*9=81
程序一开始先进行初始化也就是int i=0的部分,之后就不进行这部分,判断循环条件是否为true,
如果为true则进入语句组的环节,否则直接结束循环。语句组步骤结束后进行送代,然后再进行下一次的循环直到结束。
2.3.2 增强for语句
java 5之后提供了一种专门用于遍历集合的for循环----增强for循环。使用增强for循环不必按照for的标准套路编写代码,只需要提供一个集合就可以遍历
int[] num={43,32,53,54,75,7,10};
//增强for语句
for(int item:num)
{
System.out.println("is:"+item);
}
item不是循环变量,它保存了集合中的元素,增强for语句将集合中的元素一一取出来,并保存到item中,这个过程不需要使用循环变量,通过数组下标访问数组的元素。可见增强for语句在遍历集合时要简单的多。
3.跳转语句
3.1break语句
break语句用于循环语句(do-while、while、for),它的作用是强行退出循环体,不在执行循环体中剩余的语句。
在循环体中使用break的两种方式,带有标签和不带标签。语法格式:
break;//不带标签
break label1;//带标签,label1是标签名
不带标签的break直接跳出所在层的循环体,有带标签的break语句,跳出循环体,进入标签所在的地方。·
代码例题如下:
for(int i=0;i<10;i++)
{
if(i==3)
{
break;
}
System.out.println("i="+i);
}
结果如下:
i=0
i=1
i=2
带有标签的break例子:
for(int i=0;i<10;i++)
{
if(i==3)
{
break label1;
}
System.out.println("i="+i);
}
label1: i=4;
输出结果:
i=0
i=1
i=2
i=4
i=5
i=6
i=7
i=8
i=9
3.2 contince语句
continue语句用来结束本次循环,跳过循环体中还没有执行的语句,在进行终止条件的判断前,还要先执行送代语句。
在循环体中使用continue的两种方式,带有标签和不带标签。语法格式:
continue;//不带标签
continue label1;//带标签,标签是label1
例题如下:
for(int i=0;i<10;i++)
{
if(i==3)
{
continue;
}
System.out.println("i="+i);
}
结果如下:
i=0
i=1
i=2
i=4
i=5
i=6
i=7
i=8
i=9
带标签的continue的例子如下:
for(int i=0;i<10;i++)
{
if(i==3)
{
continue label1;
}
System.out.println("i="+i);
}
label1: i=4;
输出结果:
i=0
i=1
i=2
i=4
i=5
i=6
i=7
i=8
i=9
3.3return
Java中return用于方法,两个作用:
(1)返回方法指定类型的值(这个值总是确定的),也可以是对象
(2)方法的结束
两种形式:
(1)有返回类型 例如:return i;
(2)无返回类型 return;
一般方法前有void代表无返回值,没有void有返回值。
public class text1 {
public void add1(){
System.out.println("无返回值的return");
int i=0;
for(i=1;i<=3;i++)
{
System.out.println(i);
}
return;
}
public String add2(){
System.out.println("有返回值的return");
return "返回一个字符串";
}
public static void main(String[] args) {
text1 t=new text1();
t.add1();
t.add2();
}
运行结果:
无返回值的return
1
2
3
有返回值的return
3.4 throw
throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw。
package book.exception;
/** */ /**
* 抛出异常和声明异常
* @author joe
*
*/
public class ThrowAndThrows ... {
/** *//**
* 计算一个数字的平方根
* @param nStr 以字符串的形式提供数字
* @return 返回平方根
* @throws Exception 当用户输入的字符串为空,
* 或者字符串无法转换成数字,或者转换成的数字小于0,都会抛出异常
*/
public static double sqrt(String nStr) throws Exception ...{
if (nStr == null) ...{
//用trow关键字抛出异常,当异常被抛出时,程序会跳出该方法
throw new Exception("输入的字符不能为空!");
}
double n = 0;
try ...{
n = Double.parseDouble(nStr);
} catch(NumberFormatException e) ...{
//将parseDouble方法可能抛出的异常NumberFormatException捕获,
//然后将捕获的异常重新封装并输出
throw new Exception("输入的字符串必须能够转化成数字!", e);
}
if (n < 0 )...{
throw new Exception("输入的字符串转化成的数字必须大于0!");
}
return Math.sqrt(n);
}
public static void main(String[] args) throws Exception ...{
try...{
ThrowAndThrows.sqrt("-124.56");
} catch(Exception e) ...{
//将sqrt方法声明的可能抛出的Exception异常捕获
//打印捕获的异常的堆栈信息,从堆栈信息中可以发现异常发生的位置和原因
System.out.println("Got a Exception:" + e.getMessage());
e.printStackTrace();
throw e; //不做进一步处理,将异常向外抛出
}
//将sqrt声明了可能会抛出的异常向外抛出,必须在方法声明中使用throws
ThrowAndThrows.sqrt("-124.56");
}
}
Got a Exception:输入的字符串转化成的数字必须大于0!
java.lang.Exception: 输入的字符串转化成的数字必须大于0!
at book.exception.ThrowAndThrows.main(ThrowAndThrows.java: 37 )
Exception in thread " main " java.lang.Exception: 输入的字符串转化成的数字必须大于0!
at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java: 30 )
at book.exception.ThrowAndThrows.main(ThrowAndThrows.java: 37 )
源码分析:
在main方法里,由于sqrt方法的声明中有throws关键字,所以,在调用该方法时,必须对throws后面声明的异常进行处置,处置的方法有两种:
(1)main方法处理该异常,使用try.....catch语句,将可能会出现的异常的代码放在try块内,将处理异常的代码放在catch块内,并指明catch能够捕获的异常的类型,当异常被捕获时,执行catch块内的语句。
(2)main方法不处理该异常,将异常向外层程序抛出。在方法声明中使用throws关键字抛出异常,方法体中不需要使用try...catch语句。
异常类Exception的getMessage方法用来获取一场的描述信息,printStackTrace方法用来打印异常的堆栈信息,通过堆栈信息能够查明异常发生的原因和位置,在调试的时候常用。