在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方法用来打印异常的堆栈信息,通过堆栈信息能够查明异常发生的原因和位置,在调试的时候常用。