Java流程控制的陷阱

news2024/11/17 23:54:06

文章目录

  • 1. switch中break的作用
  • 2. switch支持的数据类型
  • 3. else隐含的条件
  • 4. 省略花括号的陷阱
  • 5. for循环的结构
  • 6. 使用标签跳出双层for循环

流程控制三种:顺序结构、分支结构、循环结构
分支机构两种:if语句、switch语句
循环结构:while循环、do while循环、for循环、foreach循环

1. switch中break的作用

break用来终止执行,而case匹配一旦匹配到就不再判断之后的case条件、default是否匹配

case标签的条件值不能重复,否则会报错

在这里插入图片描述

case 语句中如果不带break,匹配到一个case后,下面的不再匹配,都会执行,除非遇到break

情况1:完全没有break语句,那么从匹配的case块开始,后面的case块、default块代码都会执行

在这里插入图片描述

情况2:后面的case块有break,整个switch块结束

在这里插入图片描述

使用javac -Xlint:fallthrough,编译器编译时switch中若缺少break会给出警告

2. switch支持的数据类型

  • byte
  • short
  • int
  • char
  • enum
  • String
  • 上面基础类型的包装类也是支持的

枚举示例

    public static void testSwitch() {
        YesNoEnum yesNoEnum = YesNoEnum.NO;
        switch(yesNoEnum) {
            case NO:
                System.out.println("NO");
                break;
            case YES:
                System.out.println("YES");
                break;
            default:
                System.out.println("default");
        }
    }

3. else隐含的条件

  • else的字面意义是“否则”,隐含的条件是前面条件都不符合。
  • else if的条件 = if显示条件 && else隐式条件(前面条件都不符合)
    public static void main(String[] args) {
        int age = 45;
        
        if (age > 20) {
            System.out.println("青年人");
        } else if (age > 40) {
            System.out.println("中年人");
        } else if (age > 60) {
            System.out.println("老年人");
        }
    }

打印执行

>

45岁是青年人,明显不对,上面逻辑有问题

因为上面的代码等同于下面的代码

    public static void main(String[] args) {
        int age = 45;

        if (age > 20) {
            System.out.println("青年人");
        } else if (age > 40 && !(age > 20)) {
            System.out.println("中年人");
        } else if (age > 60 && !((age > 20) && (age > 40 && !(age > 20)))) {
            System.out.println("老年人");
        }
    }

打印执行

在这里插入图片描述

正确写法

    public static void main(String[] args) {
        int age = 45;

        if (age > 60) {
            System.out.println("老年人");
        } else if (age > 40) {
            System.out.println("中年人");
        } else if (age > 20) {
            System.out.println("青年人");
        }
    }

打印执行

在这里插入图片描述

因为上面代码等同于

    public static void main(String[] args) {
        int age = 45;

        if (age > 60) {
            System.out.println("老年人");
        } else if (age > 40 && !(age > 60)) {
            System.out.println("中年人");
        } else if (age > 20 && !(age > 60) && !(age > 40 && !(age > 60))) {
            System.out.println("青年人");
        }
    }

打印执行

在这里插入图片描述

总结

  • 因为else总是先排除了之前的情况,所有if else每个分支都是互斥的,只可能走一个分支
  • 所以:先处理范围小的条件,再处理范围大的条件

4. 省略花括号的陷阱

如果if语句、while语句、for语句之后没有紧跟花括号,那么它们的作用范围到该语句之后的第一个分号结束

示例1:if 有花括号

在这里插入图片描述

示例1:if 无花括号

在这里插入图片描述

示例2:while有花括号

在这里插入图片描述

示例2:while无花括号:造成死循环

在这里插入图片描述

另:当循环体只有一条局部变量定义语句时,仍然不可以省略循环体的花括号

在这里插入图片描述

加上花括号就不报错了

在这里插入图片描述

5. for循环的结构

  • 根据java规范,for循环里有且只能有两个分号作为分隔符
  • 第一个分号之前的是初始化条件
  • 两个分号中间的部分是一个返回boolean的逻辑表达式,当它返回true时for循环才会执行下一次循环
  • 第二个分号之后的是循环迭代部分,每次循环结束后会执行循环迭代部分

示例

public class ForDemo {
    public static void main(String[] args) {
        for (int i = 0, j = 1; i < 5 && j < 20; i++, j *=2 ) {
            System.out.println("2的" + i + "次方 = " + j);
        }
    }
}

打印执行

在这里插入图片描述

6. 使用标签跳出双层for循环

break只是结束所在for循环

    private static void test2() {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (j == 2) {
                    break;
                }
                System.out.println("i = " + i + ", j = " + j);
            }
        }
    }

打印执行:i值0、1、2、3、4都有,j值只有0、1,说明break只是结束了内层for循环

在这里插入图片描述

使用标签跳出双层for循环

跳出外层for循环

在这里插入图片描述

跳出内层for循环,跟break不加标签效果一样

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一篇英语文章分享:I have a dream. 争取早日阅读论文自由.

我有一个梦想》&#xff08;英文&#xff1a;I have a dream&#xff09;是美国黑人民权运动领袖马丁路德金于1963年8月28日在华盛顿林肯纪念堂发表的纪念性演讲。 《我有一个梦想》是马丁路德金在美国黑人受种族歧视和迫害由来已久的背景下&#xff0c;为了推动美国国内黑人争…

安达发|APS智能排产软件有哪些条件约束功能

APS智能排产软件是一种基于先进算法和人工智能技术的生产计划与调度系统&#xff0c;它可以帮助企业实现生产资源的优化配置&#xff0c;提高生产效率和降低生产成本。在实际应用中&#xff0c;APS智能排产软件需要满足多种条件约束功能&#xff0c;以满足不同企业的需求。以下…

python 和shell 变量互相传递

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 主要介绍python和shell变量互相传递方法&#xff0c;使用了环境变量、管道等方法。 python -> shell&#xff1a; 1.环境变量 import os var123或var123 o…

【手搓深度学习算法】用线性回归预测波士顿房价

线性回归 线性回归是一种监督学习方法&#xff0c;用于建立因变量与一个或多个自变量之间的关系。线性回归的目标是找到一条直线&#xff0c;使得所有数据点到这条直线的距离之和最小。 线性回归的基本形式如下&#xff1a; y β 0 β 1 x 1 β 2 x 2 . . . β n x n ϵ…

Linux学习之网络编程(纯理论)

写在前面 刚刚更新完Linux系统编程&#xff0c;特别推荐大家去看的Linux系统编程&#xff0c;总共44个小时&#xff0c;老师讲的非常好&#xff0c;我是十天肝完的&#xff0c;每天大概看20集&#xff0c;每天还要以写blog的形式来写笔记来总结一下&#xff0c;虽然这十天有点…

printk的使用与理解

文章目录 一、理清printk二、printk的使用三、printk的打印级别1、基本解释2、详细解释3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值 四、printk的输出地方五、其它 一、理清printk printk如何使用&#…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…

vim升级和配置

vim升级和配置 1、背景2、环境说明3、操作3.1 升级VIM3.2 配置VIM3.2.1、编辑vimrc文件3.2.2、安装插件 1、背景 日常工作跟linux系统打交道比较多&#xff0c;目前主要用到的是Cenots7和Ubuntu18这两个版本的linux系统&#xff0c;其中Centos7主要是服务器端&#xff0c;Ubun…

图神经网络|5.消息传递的计算方法 6.多层GNN的作用

5.消息传递的计算方法 边的存放方式 注意&#xff0c;在实际的边的实现方式中&#xff0c;并不是以邻接矩阵来进行实现的&#xff0c;这是因为在图的更新中&#xff0c;用邻接矩阵进行更新所占用的时间开销相对大&#xff0c;二是因为领接矩阵占用的空间大&#xff08;N方&am…

java数据结构与算法刷题-----LeetCode343. 整数拆分(TODO)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…

Linux Capabilities 进阶实战

目录 1. 快速回顾 2. 为可执行文件分配 capabilities 3. 构建半特权环境 4. 容器与 capabilities Linux Capabilities 基础概念与基本使用 上一篇学习了LinuxCapabilities的基础知识和基本使用&#xff0c;因为后面需要学习Docker的逃逸&#xff0c;理解Linux Capabilitie…

多模态+SNN个人学习历程和心得

祖传开头 这次想写一个一直深藏心中的研究方向&#xff0c;那就是多模态方向。其实当初在实验室那会儿&#xff0c;最先接触的就是多模态的工作&#xff0c;因此这是我科研之路的起点。只不过&#xff0c;后来经历了一些波折&#xff0c;导致个人没有往这个方向深挖&#xff0…

终端输入命令无法自动换行,且命令会覆盖掉前面的内容

目录 问题描述原因分析&#xff1a;解决方案&#xff1a;补充内容&#xff1a; 问题描述 进入到容器内部之后&#xff0c;在终端输入命令&#xff0c;当命令长一些的时候&#xff0c;会出现命令无法自动换行&#xff0c;而且 会覆盖掉之前的命令&#xff0c;继续写虽然不可以正…

基于大数据机器学习TF-IDF 算法+SnowNLP的智慧旅游数据分析可视化推荐系统

文章目录 基于大数据机器学习TF-IDF 算法SnowNLP的智慧旅游数据分析可视化推荐系统一、项目概述二、机器学习TF-IDF 算法什么是TF-IDF&#xff1f;TF-IDF介绍名词解释和数学算法 三、SnowNLP四、数据爬虫分析五、项目架构思维导图六、项目UI系统注册登录界面各省份热门城市分析…

Buzz 离线音频转字幕工具(完全免费,无需登录)

关于 Buzz Buzz 是一款可以自动识别语音为文本字幕的软件工具&#xff0c;基于 OpenAI 开源的 Whisper 自动语音识别模型&#xff0c;可以批量将音频或者是视频中的内容自动转化为带有时间的字幕&#xff0c;速度非常快&#xff0c;是一款能极大提高效率的生产力小工具。 Bu…

排队免单?买东西花了钱还能拿回来?——工会排队模式

随着互联网和电子商务的迅猛发展&#xff0c;消费者的购物需求和期望也在不断升级。为了满足这一需求&#xff0c;工会排队模式作为一种创新消费体验模式应运而生。 工会排队模式是一种颠覆传统的电商模式&#xff0c;它通过向消费者返还现金的方式&#xff0c;重新定义了购物体…

使用Java版工程行业管理系统源码,提升工程项目的综合管理能力

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

MySQL版本说明、版本发布日志

参考&#xff1a; 版本说明&#xff1a;https://blogs.oracle.com/mysql/post/introducing-mysql-innovation-and-longterm-support-lts-versions 官网文档 &#xff1a;https://dev.mysql.com/doc/ 发布日志&#xff1a; https://dev.mysql.com/doc/relnotes/mysql/8.0/en/ …

Spring Security介绍

一、Spring Security&#xff1a; 1、简介&#xff1a;Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。一般来说&#xff0c;Web 应用的安全性包括用户认证&#xff08;A…