当前位置: 首页 > news >正文

Case逢无意难休——深度解析JAVA中case穿透问题

Case逢无意难休——深度解析JAVA中case穿透问题~

不作溢美之词,不作浮夸文章,此文与功名进取毫不相关也!与大家共勉!!
更多文章:个人主页
系列文章:JAVA专栏
欢迎各位大佬来访哦~互三必回!!!

在这里插入图片描述

#引言

我们在学习JAVA时,switch语句是一种常见的分支结构,它可以根据表达式的值来选择执行不同的语句。然而,我们在写代码运用switch分支时经常遇到一个问题——case穿透。今天我们从执行原理产生原因代码实现等方面,来理解什么是case穿透?如何避免case穿透?如何利用case穿透?

#JAVA中switch执行原理

1.代码实现:

switch(表示值){case1 :语句体1;break ;case2:语句体2;break ;....default :语句体 n+1 ;break ;
}

2.执行流程

  • 首先计算表达式的值
  • 一次和case后面进行比较,如有对应值,就会执行相应语句,在执行的过程中,遇到break会结束。
  • 如果所有的case后面和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句。

3.流程图解

在这里插入图片描述swtich流程图

4.格式说明:

  • 表达式:(将要匹配的值)取值为byte,short,int,char,JDK5以后可以是枚举,JDK7以后的可以是String.
  • case:后面跟的是要和表达式进行比较的值(被匹配的值)
  • break:表示中断,结束的意思,用来结束swtich语句
  • default:表示所有情况下都不匹配的时候,就执行该处的内容和if语句的else相似
  • case后面的值只允许是字面量
  • case给出的值不允许重复

#什么是case穿透

要理解 case 穿透,我们首先得清楚 switch 语句的基本结构。switch 语句通过一个表达式的值与多个 case 标签后面的值进行比较,当匹配成功时,就会执行该 case 块中的代码。而 case 穿透指的是,当 switch 语句匹配到某个 case 后,如果该 case 块中没有 break 语句,程序不会停止执行,而是会继续执行下一个 case 块中的代码,直到遇到 break 或者 switch 语句结束。

#case穿透产生原因

switch 语句中,break 语句的作用是终止当前 switch 语句的执行。当没有 break 语句时,程序就会按照顺序依次执行后续 case 块中的代码。这是因为 switch 语句的设计初衷是为了在多个条件中进行选择,但并没有强制要求每个 case 块都必须有 break,所以就产生了 case 穿透这种情况。

#案例演示

下面通过一个简单的代码示例来直观地展示 case 穿透现象:

public class Example {public static void main(String[] args) {int day = 2;switch (day) {case 1:System.out.println("星期一");case 2:System.out.println("星期二");case 3:System.out.println("星期三");default:System.out.println("其他日期");}}
}

在这个示例中,day 的值为 2,程序会从 case 2 开始执行,输出 “星期二”。由于 case 2 块中没有 break 语句,程序会继续执行 case 3 块中的代码,输出 “星期三”,最后执行 default 块中的代码,输出 “其他日期”。所以最终的输出结果是:

星期二
星期三
其他日期

#利用case穿透

虽然 case 穿透有时候会带来一些意想不到的结果,但在某些特定的场景下,我们可以巧妙地利用它来简化代码。例如,我们要根据不同的月份判断该月所属的季节,就可以使用 case 穿透:

public class SeasonExample {public static void main(String[] args) {int month = 3;switch (month) {case 12:case 1:case 2:System.out.println("冬季");break;case 3:case 4:case 5:System.out.println("春季");break;case 6:case 7:case 8:System.out.println("夏季");break;case 9:case 10:case 11:System.out.println("秋季");break;default:System.out.println("无效的月份");}}
}
春季

在这个示例中,我们利用 case 穿透,将属于同一个季节的月份写在一起,当 month 的值匹配到某个月份时,程序会继续执行后续的 case 块,直到遇到 break 语句,这样就可以避免重复的代码。

#case穿透带来的问题

在大多数情况下,case 穿透并不是我们想要的结果,它可能会导致程序出现逻辑错误。为了避免这种情况,我们需要在每个 case 块中都添加 break 语句,确保程序在执行完匹配的 case 块后就停止执行。例如:

public class AvoidFallThrough {public static void main(String[] args) {int number = 1;switch (number) {case 1:System.out.println("数字是 1");break;case 2:System.out.println("数字是 2");break;case 3:System.out.println("数字是 3");break;default:System.out.println("未知数字");}}
}
数字是1

在这个示例中,每个 case 块都有 break 语句,当 number 的值为 1 时,程序只会执行 case 1 块中的代码,输出 “数字是 1”,然后就会终止 switch 语句的执行。

#总结

case 穿透是 Java 中 switch 语句的一个特殊特性,它既有可能带来便利,也可能导致程序出现逻辑错误。我们需要深入理解它的原理,在合适的场景下利用它来简化代码,同时在不需要它的时候通过添加 break 语句来避免潜在的问题。通过对 case 穿透的正确使用和处理,我们可以让 switch 语句在我们的程序中发挥出更大的作用。

希望通过本文的介绍,你对 Java 中的 case 穿透现象有了更深入的理解。在实际编程中,要时刻注意 break 语句的使用,确保程序的逻辑正确性。
在这里插入图片描述

感谢阅读!您的支持是我更新的最大动力!!

往期高分文章:
java之小六壬算命代码实现——预知自己命运如何!
AIGC | Midjourney使用指南,直接拿捏~
CMD常用命令符大全,提高办公效率(值得收藏)

更多文章欢迎关注文章主页:个人主页

相关文章:

Case逢无意难休——深度解析JAVA中case穿透问题

Case逢无意难休——深度解析JAVA中case穿透问题~ 不作溢美之词,不作浮夸文章,此文与功名进取毫不相关也!与大家共勉!! 更多文章:个人主页 系列文章:JAVA专栏 欢迎各位大佬来访哦~互三必回&#…...

Golang笔记——常用库context和runtime

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的常用库context和runtime,包括库的基本概念和基本函数的使用等。 文章目录 contextcontext 包的基本概念主要类型和函数1. **…...

2000-2020年各省第二产业增加值占GDP比重数据

2000-2020年各省第二产业增加值占GDP比重数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围:31省 5、指标解释:第二产业增加值占GDP比重…...

unity商店插件A* Pathfinding Project如何判断一个点是否在导航网格上?

需要使用NavGraph.IsPointOnNavmesh(Vector3 point) 如果点位于导航网的可步行部分,则为真。 如果一个点在可步行导航网表面之上或之下,在任何距离,如果它不在更近的不可步行节点之上 / 之下,则认为它在导航网上。 使用方法 Ast…...

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?

文章目录 13003数据结构与算法全书框架考试题型的分值分布如何? 本次内容概述绪论第一节概览什么是数据、数据元素,数据项,数据项的值?什么是数据结构?分哪两种集合形式(逻辑和存储)&#xff1f…...

富文本 tinyMCE Vue2 组件使用简易教程

参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…...

强化学习在自动驾驶中的实现与挑战

强化学习在自动驾驶中的实现与挑战 自动驾驶技术作为当今人工智能领域的前沿之一,正通过各种方式改变我们的出行方式。而强化学习(Reinforcement Learning, RL),作为机器学习的一大分支,在自动驾驶的实现中扮演了至关重要的角色。它通过模仿人类驾驶员的决策过程,为车辆…...

记录 | MaxKB创建本地AI智能问答系统

目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…...

特种作业操作之低压电工考试真题

1.下面&#xff08; &#xff09;属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案&#xff1a;C 2.事故照明一般采用&#xff08; &#xff09;。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案&#xff1a;B 3.人体同时接触带电设备或线路中的两相导体时&#xff0c;电流从一相通过人体流…...

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django博客系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展&#xff0c;信息的传播与…...

Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程

一、问题描述 在使用 Maven 管理项目依赖时&#xff0c;遇到了一个棘手的问题。具体表现为&#xff1a;在 pom.xml 文件中导入了所需的依赖&#xff0c;并且在 IDE 中导入语句没有显示为红色&#xff08;表示 IDE 没有提示依赖缺失&#xff09;&#xff0c;但是在实际使用这些依…...

我们需要有哪些知识体系,知识体系里面要有什么哪些内容?

01、管理知识体系的学习知识体系 主要内容&#xff1a; 1、知识管理框架的外部借鉴、和自身知识体系的搭建&#xff1b; 2、学习能力、思维逻辑能力等的塑造&#xff1b; 3、知识管理工具的使用&#xff1b; 4、学习资料的导入和查找资料的渠道&#xff1b; 5、深层关键的…...

什么是vue.js组件开发,我们需要做哪些准备工作?

Vue.js 是一个非常流行的前端框架,用于构建用户界面。组件开发是 Vue.js 的核心概念之一,通过将界面拆分为独立的组件,可以提高代码的可维护性和复用性。以下是一个详细的 Vue.js 组件开发指南,包括基础概念、开发流程和代码示例。 一、Vue.js 组件开发基础 1. 组件的基本…...

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…...

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中&#xff0c;参数的数量成千上万&#xff0c;因此&#xff0c;需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量&#xff0c;特征量指的是从输入数据/图像中提取出的本质的数 …...

【Python】第五弹---深入理解函数:从基础到进阶的全面解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、函数 1.1、函数是什么 1.2、语法格式 1.3、函数参数 1.4、函数返回值 1.5、变量作用域 1.6、函数…...

【MQ】如何保证消息队列的高性能?

零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件&#xff0c;基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…...

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…...

用C++编写一个2048的小游戏

以下是一个简单的2048游戏的实现。这个实现使用了控制台输入和输出&#xff0c;适合在终端或命令行环境中运行。 2048游戏的实现 1.游戏逻辑 2048游戏的核心逻辑包括&#xff1a; • 初始化一个4x4的网格。 • 随机生成2或4。 • 处理玩家的移动操作&#xff08;上、下、左、…...

为何SAP S4系统中要设置MRP区域?MD04中可否同时显示工厂级、库存地点级的数据?

【SAP系统PP模块研究】 一、物料主数据的MRP区域设置 SAP ECC系统中想要指定不影响MRP运算的库存地点,是针对库存地点设置MRP标识,路径为:SPRO->生产->物料需求计划->计划->定义每一个工厂的存储地点MRP,如下图所示: 另外,在给物料主数据MMSC扩充库存地点时…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...