揭秘!那些年我们写过的switch语句,到底隐藏了多少坑?

简介: 【6月更文挑战第14天】Java中的switch语句简洁但易误用。忘记在case后加break会导致连续执行多个case,应确保每个case后都有break。switch仅支持byte, short, char, int, 枚举和String类型,其他类型需转换。遗漏default子句可能造成逻辑漏洞,建议始终包含default以处理未预期情况。注意这些细节可提升代码质量。

在Java编程的漫长旅程中,switch语句作为条件控制结构的一员,以其简洁明了的特点深受开发者喜爱。然而,就像任何强大的工具一样,不当的使用往往会埋下隐患。今天,我们就来揭开switch语句背后的秘密,看看那些年我们踩过的坑,以及如何巧妙避开它们。

案例一:忘记break引发的连锁反应

int dayOfWeek = 3; // 假设表示星期三
switch (dayOfWeek) {
   
    case 1:
        System.out.println("Monday");
    case 2:
        System.out.println("Tuesday");
    case 3:
        System.out.println("Wednesday");
    case 4:
        System.out.println("Thursday");
    case 5:
        System.out.println("Friday");
    default:
        System.out.println("Weekend");
}

这段代码看似无害,但运行后你会发现,控制台不仅输出了"Wednesday",还依次打印了"Thursday", "Friday"和"Weekend"。原因在于switch语句默认会继续执行下一个case,除非遇到break语句。因此,正确的做法是在每个case后面加上break,阻止这种“连锁反应”。

改进后的代码如下:

switch (dayOfWeek) {
   
    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;
    default:
        System.out.println("Weekend");
        break;
}

案例二:忽视switch语句的类型限制

在使用switch语句时,很多人可能会直接将任意类型的变量放入switch表达式中,殊不知,Java对switch表达式的类型有着严格的限制。有效的类型包括byte、short、char、int以及它们对应的包装类,还有枚举类型和String类型。尝试使用float或double等其他类型,编译器将会报错。

错误示例:

float version = 1.1f;
switch (version) {
    // 编译错误
    case 1.0f:
        System.out.println("Version 1.0");
        break;
    case 1.1f:
        System.out.println("Version 1.1");
        break;
}

正确的做法是转换变量类型或重新设计逻辑:

int versionInt = (int) version;
switch (versionInt) {
   
    case 1:
        System.out.println("Version 1.0 or 1.1");
        break;
}

案例三:遗漏default子句导致的逻辑漏洞

在switch语句中,default子句的作用是当所有case都不匹配时执行的代码块。虽然不是强制性的,但在很多情况下,添加default子句可以增强代码的健壮性,防止因未考虑到的case导致的运行时错误。

int status = 10; // 假设status的值不在预期内
switch (status) {
   
    case 1:
        System.out.println("Status 1");
        break;
    case 2:
        System.out.println("Status 2");
        break;
    // 没有default子句
}

当status的值既不是1也不是2时,程序将不做任何操作,这可能不是预期的行为。因此,建议在switch语句中始终包含一个default子句,即使它仅仅是为了打印一条错误消息。

改进后的代码如下:

switch (status) {
   
    case 1:
        System.out.println("Status 1");
        break;
    case 2:
        System.out.println("Status 2");
        break;
    default:
        System.out.println("Invalid status: " + status);
        break;
}

总结而言,switch语句虽简单,但使用不当同样会埋下不少坑。通过以上案例分析,我们不仅揭示了switch语句的潜在陷阱,也提供了相应的解决方案。记住,良好的编程习惯和细致的逻辑思考,才能让你的代码更加稳健和优雅。下次使用switch语句时,不妨再次审视一下,确保没有遗漏那些隐藏的细节。

相关文章
|
26天前
|
安全 Java 编译器
switch语句,到底隐藏了多少坑?
在Java编程中,switch语句以简洁高效著称,但也暗藏陷阱。遗忘`break`会导致意外的“贯穿”执行,须在每个case后添加`break`以终止流程。switch表达式的类型有限制,如float和double不被接受,需转换为整数类型或采用其他策略。遗漏`default`子句可能造成逻辑漏洞,应始终考虑不匹配情况以增强代码健壮性。正确运用这些技巧,能让代码更稳健优雅。
21 2
|
4月前
|
存储 算法 程序员
C语言隐藏的代码技巧
C语言隐藏的代码技巧
34 0
|
搜索推荐 算法 编译器
5.13 汇编语言:仿写For循环语句
循环语句(for)是计算机编程中的一种基本控制结构,它允许程序按照指定的次数或范围重复执行一段代码块。for循环在处理需要进行迭代操作的情况下非常有用,它使得程序可以更加方便地控制循环的次数。一般来说,for循环由三个部分组成:初始化部分、条件表达式和更新部分,以及一个需要重复执行的代码块。在每次循环迭代开始时,程序首先执行初始化部分,然后检查条件表达式的值,如果为真,则执行代码块,并在每次循环结束后执行更新部分。只要条件表达式为真,for循环就会一直重复执行;一旦条件表达式为假,循环将停止,程序继续执行循环之后的代码。
70 0
|
算法 编译器 C++
5.12 汇编语言:仿写While循环语句
循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止。循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作。一般来说,While循环由一个条件表达式、一个代码块组成。在每次循环迭代开始时,程序会首先检查条件表达式的值,如果为真,则执行代码块,然后再次检查条件表达式的值。只要条件表达式为真,循环就会一直继续执行;一旦条件表达式为假,循环将停止,程序继续执行循环之后的代码。
97 0
|
4月前
|
存储 设计模式 前端开发
【JavaScript】10个技巧干掉你代码中那些丑陋冗长的 if...else 语句~
【JavaScript】10个技巧干掉你代码中那些丑陋冗长的 if...else 语句~
|
缓存 Linux C语言
【初始C语言2】详细认识分支语句和循环语句以及他们的易错点,应用(猜大小游戏)
【初始C语言2】详细认识分支语句和循环语句以及他们的易错点,应用(猜大小游戏)
129 0
|
编译器 C语言 C++
5.11 汇编语言:仿写IF条件语句
条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构。它允许程序根据条件的真假来执行不同的代码块。条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。条件表达式的结果通常是布尔值(True或False),决定了程序将执行IF代码块还是ELSE代码块。
94 0
|
程序员
相见恨晚的Matlab编程小技巧(2)-代码怎么做到逻辑清晰?——巧用注释符“%“
        本文将以教程的形式详细介绍Matlab中两个常用符号“%”和“%%”的作用。初学者可以通过此文掌握这两个符号的用法,为Matlab编程打下坚实的基础。
|
程序员 C语言
【C语言初阶】分支语句If与switch的具体用法,有这篇博客就够了
【C语言初阶】分支语句If与switch的具体用法,有这篇博客就够了
160 0
|
存储 前端开发 JavaScript
【JavaScript】10个技巧干掉你代码中那些丑陋冗长的 if...else 语句~(三)
【JavaScript】10个技巧干掉你代码中那些丑陋冗长的 if...else 语句~(三)