Java

Java 知识量:11 - 45 - 220

2.5 流程控制语句><

if/else语句- 2.5.1 -

if/else语句用于根据特定条件执行不同的操作。这是其基本语法:

if (condition) {  
  // code to be executed if condition is true  
} else {  
  // code to be executed if condition is false  
}

这个代码段检查condition是否为真。如果condition为真,则执行if语句块中的代码;如果condition为假,则执行else语句块中的代码。

例如,假设有一个变量score,想检查这个分数是否及格(大于或等于60):

int score = 75;  
  
if (score >= 60) {  
  System.out.println("You passed the exam.");  
} else {  
  System.out.println("You failed the exam.");  
}

在这个例子中,因为score大于或等于60,所以输出会是 "You passed the exam."。

还可以使用else if来指定新的条件进行测试,如果第一个条件为假:

if (condition1) {  
  // code to be executed if condition1 is true  
} else if (condition2) {  
  // code to be executed if condition1 is false and condition2 is true  
} else {  
  // code to be executed if both condition1 and condition2 are false  
}

这种结构非常有用,因为它允许你根据多个条件执行不同的操作。

switch语句- 2.5.2 -

switch语句是一种多路选择结构,它允许根据变量的值来选择要执行的代码块。switch语句通常用于替换一系列嵌套的if-else语句,使代码更简洁和易读。

以下是switch语句的基本语法:

switch (expression) {  
    case value1:  
        // 代码块1  
        break;  
    case value2:  
        // 代码块2  
        break;  
    // 更多的case语句  
    default:  
        // 默认代码块(可选)  
}

其中:

  • expression:要测试的变量或表达式。该表达式必须是一个整型(byte, short, int, char)、枚举、字符串或者从Java SE 7开始,它还可以是一个String类型。

  • case:用于指定要比较的值。每个case后面跟着一个冒号(:)。

  • break:用于跳出switch语句,结束当前的case。如果省略break,则会继续执行下一个case,直到遇到break或整个switch语句结束。

  • default:可选的,用于处理没有匹配的情况。如果没有匹配的case,则执行default代码块。

下面是一个使用switch语句的简单示例:

public class SwitchExample {  
    public static void main(String[] args) {  
        int day = 3;  
        switch (day) {  
            case 1:  
                System.out.println("Monday");  
                break;  
            case 2:  
                System.out.println("Tuesday");  
                break;  
            case 3:  
                System.out.println("Wednesday");  
                break;  
            case 4:  
                System.out.println("Thursday");  
                break;  
            case 5:  
                System.out.println("Friday");  
                break;  
            case 6:  
                System.out.println("Saturday");  
                break;  
            case 7:  
                System.out.println("Sunday");  
                break;  
            default:  
                System.out.println("Invalid day");  
        }  
    }  
}

在这个例子中,根据变量day的值来输出星期几。如果day的值不在1到7之间,就会执行default代码块,输出"Invalid day"。

while语句- 2.5.3 -

while语句用于执行重复任务,只要指定的条件为真,就会重复执行一组语句。下面是一个基本的while循环的例子:

int i = 0;  
while (i < 10) {  
    System.out.println(i);  
    i++;  
}

在这个例子中,只要i小于10,就会一直打印i的值,然后增加i的值。当i不再小于10时,循环就会结束。

注意:在while循环中,确保循环的终止条件能够在某个时间点达成,否则循环会一直进行下去,导致程序无法正常结束。在以上例子中,通过每次循环后递增i的值来确保终止条件(i < 10)最终会变为假,从而结束循环。

do语句- 2.5.4 -

Java中的do-while循环语句用于执行一段代码块。do-while循环与while循环类似,但是do-while循环至少会执行一次代码块,然后再检查条件。如果条件为真,循环将继续执行,直到条件为假。

以下是Java中do-while循环的语法:

do {  
  // 代码块  
} while (条件);

在上面的语法中,"代码块"是要执行的代码,"条件"是一个布尔表达式,用于确定是否继续循环。

以下是一个示例,演示如何使用do-while循环打印数字1到5:

int i = 1;  
do {  
  System.out.println(i);  
  i++;  
} while (i <= 5);

在上面的示例中,do-while循环将打印数字1到5,因为循环会在i的值达到6之后停止。

for语句- 2.5.5 -

for语句用于执行重复的任务。以下是它的基本结构:

for (初始化; 条件; 迭代) {  
    // 代码块  
}

其中:

  • 初始化:在循环开始前执行一次,通常用于设置计数器变量。

  • 条件:每次循环开始前都会检查此条件。如果为true,则执行循环。如果为false,则停止循环。

  • 迭代:每次循环后执行一次,通常用于更新计数器。

示例如下:

for (int i = 1; i <= 10; i++) {  
  System.out.println(i);  
}

在这个例子中:

  • 初始化:声明并定义了一个名为i的变量,并将其初始化为1。

  • 条件:设定了一个条件i <= 10。这意味着只要i的值小于或等于10,循环就会继续。

  • 迭代:每次循环结束时,都会增加i的值(i++)。这是一个简单的操作,使i的值增加1。

for each语句- 2.5.6 -

for each语句是一种用于循环遍历数组或集合中每个元素的语法结构。它提供了一种简洁的方式来迭代数组或集合,而不需要使用索引或迭代器。

for each语句的语法如下:

for (元素类型 变量名 : 数组或集合) {  
    // 循环体内的操作  
}

其中,元素类型是要遍历的数组或集合中元素的类型,变量名是一个用于引用当前元素的变量名,数组或集合是要遍历的数组或集合。

以下是一个使用for each语句遍历数组的示例:

int[] numbers = {1, 2, 3, 4, 5};  
  
for (int number : numbers) {  
    System.out.println(number);  
}

在上面的示例中,定义了一个名为numbers的整数数组,并使用for each语句遍历数组中的每个元素,并将它们打印到控制台上。

也可以使用"for each"语句遍历其他类型的集合,例如List、Set等。只需将元素类型替换为集合中元素的类型,变量名替换为当前元素的引用变量名,数组或集合替换为要遍历的集合对象即可。

break语句- 2.5.7 -

break语句用于跳出当前循环(例如for、while或do-while循环)。当在循环内部使用break语句时,循环将立即终止,程序控制将传递到循环之后的下一条语句。

下面是一个简单的示例,展示了在使用break语句时如何跳出for循环:

for (int i = 1; i <= 10; i++) {  
    if (i == 5) {  
        break; // 当 i 等于 5 时跳出循环  
    }  
    System.out.println(i);  
}

在上面的代码中,当i的值达到5时,break语句将终止for循环。因此,该程序将输出1到4的数字,然后终止。

注意,break语句只能跳出其所在的循环,如果嵌套了多层循环,break只能跳出最内层的循环。如果你想跳出外层循环,可以使用带有标签的break语句。

带有标签的break语句示例:

outer: for (int i = 1; i <= 5; i++) {  
    inner: for (int j = 1; j <= 5; j++) {  
        if (i * j == 10) {  
            break outer; // 当 i * j 等于 10 时跳出外层循环  
        }  
        System.out.println(i * j);  
    }  
}

在上面的示例中,当i * j的值达到10时,带有标签的break outer语句将终止外层循环。

continue语句- 2.5.8 -

continue语句用于跳过当前循环中的剩余语句,并立即进入下一次循环。这意味着,如果continue语句在一个循环内部(例如,for、while或者do-while循环)被执行,那么循环的剩余部分将被跳过,程序将立即返回到循环的开头,开始下一次的循环。

以下是一个简单的例子说明continue语句的用法:

for (int i = 0; i < 10; i++) {  
    if (i % 2 == 0) {  
        continue;  // 如果i是偶数,则跳过剩余的语句,直接进入下一次循环  
    }  
    System.out.println(i);  // 如果i是奇数,这行代码将被执行  
}

在这个例子中,当i是偶数时,continue语句被执行,因此"System.out.println(i);"这行代码被跳过。所以,这段代码最后只会打印出奇数。

try/catch/finally语句- 2.5.9 -

Java中的try/catch/finally语句用于处理可能在代码中发生的异常。

try语句块包含可能引发异常的代码。如果在try块中发生异常,则程序将跳转到相应的catch块,以处理异常。catch块包含处理特定异常的代码。

finally语句块包含无论是否发生异常都需要执行的代码。无论try或catch块中的代码如何结束,finally块中的代码都会执行。这对于关闭文件、网络连接和其他资源非常有用,以确保它们被正确释放。

以下是一个简单的示例:

try {  
    // 可能引发异常的代码  
    int result = 1 / 0; // 除以0会引发异常  
} catch (ArithmeticException e) {  
    // 处理异常的代码  
    System.out.println("发生了算术异常: " + e.getMessage());  
} finally {  
    // 无论是否发生异常都需要执行的代码  
    System.out.println("最终会执行此代码块。");  
}

在上面的示例中,try块中的代码尝试除以0,这会引发算术异常。catch块捕获并处理该异常,而finally块中的代码无论是否发生异常都会执行。

throw语句- 2.5.10 -

throw语句用于引发一个异常。这是异常处理机制的一部分,它允许创建自定义异常并在代码中引发它们。

throw语句的基本语法如下:

throw new ExceptionType(exceptionMessage);

其中:

  • ExceptionType是要引发的异常的类型。这可以是Java内置的异常类型,如RuntimeException,或者用户创建的自定义异常类型。

  • exceptionMessage是一个可选的字符串,提供有关异常的更多详细信息。

这是一个例子,展示了如何使用throw语句引发一个自定义异常:

public class Main {  
    public static void main(String[] args) {  
        try {  
            int result = divide(10, 0);  
        } catch (MyException e) {  
            System.out.println("Caught an exception: " + e.getMessage());  
        }  
    }  
  
    public static int divide(int a, int b) throws MyException {  
        if (b == 0) {  
            throw new MyException("Cannot divide by zero");  
        }  
        return a / b;  
    }  
}  
  
class MyException extends Exception {  
    public MyException(String message) {  
        super(message);  
    }  
}

在这个例子中,定义了一个自定义异常类型MyException。在divide方法中,如果第二个参数是0,使用throw语句引发一个MyException异常。然后在main方法中,使用try和catch语句来捕获并处理这个异常。

synchronized语句- 2.5.11 -

synchronized关键字用于控制对共享资源的并发访问,以防止线程安全问题。当一个线程访问一个synchronized修饰的共享资源时,其他试图访问该资源的线程将被阻塞,直到第一个线程执行完毕。

在Java中,synchronized关键字可以用于方法或代码块。当它用于方法时,它将锁定整个方法。当它用于代码块时,它将锁定指定的代码块。

以下是一个使用synchronized关键字的示例:

public class Counter {  
    private int count = 0;  
  
    public synchronized void increment() {  
        count++;  
    }  
  
    public synchronized void decrement() {  
        count--;  
    }  
  
    public synchronized int getCount() {  
        return count;  
    }  
}

在上面的示例中,increment()、decrement()和getCount()方法都被声明为synchronized,这意味着在多线程环境中,只有一个线程可以同时访问这些方法。当一个线程调用这些方法之一时,其他线程将被阻塞,直到第一个线程完成执行。

还可以使用synchronized关键字来锁定特定的代码块,而不是整个方法。以下是一个使用synchronized代码块的示例:

public class Counter {  
    private int count = 0;  
  
    public void increment() {  
        synchronized (this) {  
            count++;  
        }  
    }  
  
    public void decrement() {  
        synchronized (this) {  
            count--;  
        }  
    }  
  
    public int getCount() {  
        synchronized (this) {  
            return count;  
        }  
    }  
}

在上面的示例中,synchronized关键字用于锁定特定的代码块,而不是整个方法。这可以提高性能,因为多个线程可以同时访问同一个对象的不同代码块。但是,需要注意的是,在使用synchronized代码块时,必须小心选择锁定的对象,以避免死锁等问题。

return语句- 2.5.12 -

在Java编程语言中,return语句用于从当前的方法中返回,并且可以携带返回的值。

以下是return语句的一些基本用法:

1、从方法中返回一个值:当在方法中使用了return语句,这个方法就不再继续执行,而是返回你指定的值。

public int getDouble(int x) {  
    return 2 * x;  
}

在这个例子中,getDouble方法返回x的两倍。当调用这个方法并传递一个参数,它将返回那个参数的两倍。
2、从方法中返回void:如果方法的返回类型是void,那么return语句可以不返回任何值,或者可以不写return语句。

public void printHello() {  
    System.out.println("Hello, world!");  
    return;  
}

在这个例子中,printHello方法打印出"Hello, world!",然后返回。因为这个方法的返回类型是void,所以return语句后面没有返回值。
3、从一个lambda表达式中返回:可以在lambda表达式中使用return语句来返回一个值。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
numbers.stream()  
    .map(x -> {   
        if (x % 2 == 0) {  
            return x * 2;  
        } else {  
            return x * 3;  
        }  
    })  
    .forEach(System.out::println);

在这个例子中,使用了Java 8的流和lambda表达式。如果数字是偶数,返回它的两倍;如果数字是奇数,返回它的三倍。
4、 从switch语句中返回:可以在switch语句中使用return语句来返回一个值。

public int getNumber(int x) {  
    switch (x) {  
        case 1: return 10;  
        case 2: return 20;  
        default: return 30;  
    }  
}

在这个例子中,如果x等于1,方法返回10;如果x等于2,方法返回20;否则,方法返回30。
5、从try-catch语句中返回:可以在try或catch块中使用return语句来返回一个值。

public int divide(int x, int y) {  
    try {  
        return x / y;  
    } catch (ArithmeticException e) {  
        return -1;  // 返回-1表示除法运算失败  
    }  
}

在这个例子中,尝试将x除以y。如果除法成功,返回结果;如果除法失败(例如,如果y等于0),捕获一个算术异常并返回-1。