好主不。 有时在满足总体要求的循环中可能会出现某些情况,而不满足逻辑循环条件。 在这种情况下,使用break ,来阻止你毫无意义地在循环中循环。

String item; for(int x = 0; x < 10; x++) { // Linear search. if(array[x].equals("Item I am looking for")) { //you've found the item. Let's stop. item = array[x]; break; } }

在这个例子中更有意义。 每次都继续循环到10次,即使find了它,或者循环直到find该项目并停止? 或者把它变成现实世界的条件; 当你find你的钥匙,你继续看?

编辑回应评论

为什么不把x设置为11来打破循环? 没有用。 我们break ! 除非你的代码是假设x肯定大于10以后(而且可能不应该是这样),那么你就可以使用break 。

为了完整性而编辑

绝对有其他方法来模拟break 。 例如,在循环中添加额外的逻辑到您的终止条件。 说无论是循环还是使用break都是不公平的。 正如所指出的,while循环通常可以实现类似的function。 例如,按照上面的例子..

while(x < 10 && item == null) { if(array[x].equals("Item I am looking for")) { item = array[x]; } x++; }

简单地使用break意味着你可以用for循环来实现这个function。 这也意味着,只要您希望循环的行为不同,就不必在条件中添加终止逻辑。 例如。

for(int x = 0; x < 10; x++) { if(array[x].equals("Something that will make me want to cancel")) { break; } else if(array[x].equals("Something else that will make me want to cancel")) { break; } else if(array[x].equals("This is what I want")) { item = array[x]; } }

而不是一个具有如下终止条件的while loop :

while(x < 10 && !array[x].equals("Something that will make me want to cancel") && !array[x].equals("Something else that will make me want to cancel"))

使用break ,就像其他任何语言function一样,在特定的情况下,如果明显滥用, 可能是不好的做法。 但是一些非常重要的成语不能没有它,或至less会导致更less的可读代码。 在这些情况下, break是要走的路。

换句话说,不要听任何一揽子,不合格的build议 – 关于break或其他事情。 我从来没有见过这样的代码完全憔悴,只是为了强制实施一个“良好的做法”。

关于你对性能开销的关注,绝对没有。 在字节码级别,无论如何都没有显式的循环结构:所有的stream程控制都是通过条件跳转来实现的。

JLS指定一个中断是一个循环的exception终止。 但是,仅仅因为它被认为是exception的,并不意味着它不被用于许多不同的代码示例,项目,产品,太空穿梭机等等.JVM规范并没有说明是否存在性能损失,虽然它是在循环之后清除代码执行将继续。

但是,代码可读性可能会遭遇奇怪的中断。 如果你坚持在一个复杂的if语句中包含副作用和奇怪的清理代码,可能是带有标签的多层次中断(或者更糟糕的是,具有一组奇怪的退出条件),那么它不会任何人都可以轻松阅读。

如果你想通过强制迭代variables超出迭代范围来打破循环,或者通过其他方式引入不必要的直接退出方式,那么它的可读性就不如break 。

然而,以空方式循环多余的时间几乎总是不好的做法,因为它需要额外的迭代并且可能不清楚。

使用break in循环可以是完全合法的,甚至可以是解决某些问题的唯一方法。

然而,新的程序员通常会滥用它,导致代码混淆,特别是通过使用break来停止循环条件语句中可能已经写入循环条件语句的循环,这是不好的声誉。

在我看来,当一个固定的迭代次数完成时,应该使用一个For循环,并且在每次迭代完成之前都不会停止。 在另一种情况下,如果你想早点退出,我宁愿使用While循环。 即使你阅读这两个小字,看起来更合乎逻辑。 一些例子:

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

当我快速读取这些代码时,我将确定它会打印出10行,然后继续。

for (int i=0;i<10;i++) { if (someCondition) break; System.out.println(i); }

这个对我来说已经不太清楚了。 为什么你要先说明你要做10次迭代,但是在循环中join一些额外的条件以便尽早停止?

我更喜欢前面用这种方式编写的例子(即使它稍微冗长一点,但只有1行更多):

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

每个阅读这段代码的人都会立即看到有一个额外的条件可能会提前终止循环。

当然,在非常小的循环中,你总是可以讨论每个程序员都会注意到break语句。 但是我可以从我自己的经验中得知,在更大的循环中,这些rest可以被监督。 (而这又把我们带到了另一个话题上,开始把代码分成小块)

不,如果达到了某些所需的条件 (如发现匹配),跳出循环并不是一个错误的做法。 很多时候,你可能想停止迭代,因为你已经达到了你想要的,没有任何重复的地步。 但是,要小心,以确保你不会意外地丢失东西或不需要的时候爆发。

如果你打破了循环,而不是遍历数千条logging,即使循环的目的是完整的(即可能匹配所需的logging已经完成),也可以增加性能改进 。

例如:

for (int j = 0; j < type.size(); j++) { if (condition) { // do stuff after which you want break; // stop further iteration } }

这不是不好的做法,但会使代码更不可读。 一个有用的重构来解决这个问题是将循环移动到一个单独的方法,然后使用返回语句,而不是一个rest,例如(例如从@克里斯的答案举起):

String item; for(int x = 0; x < 10; x++) { // Linear search. if(array[x].equals("Item I am looking for")) { //you've found the item. Let's stop. item = array[x]; break; } }

可以重构(使用提取方法 )到这:

public String searchForItem(String itemIamLookingFor) { for(int x = 0; x < 10; x++) { if(array[x].equals(itemIamLookingFor)) { return array[x]; } } }

当从周围的代码调用时,可以certificate更具可读性。

如果你开始做这样的事情,那么我会说它开始变得有点奇怪,你最好把它移动到一个单独的方法,在matchedCondition returns一个结果。

boolean matched = false; for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if(matchedCondition) { matched = true; break; } } if(matched) { break; } }

为了详细说明如何清理上面的代码,可以重构,将代码移动到returns而不是使用breaks的函数。 这是一般来说,更好地处理复杂/杂乱的breaks 。

public boolean matches() for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if(matchedCondition) { return true; } } } return false; }

但是对于像我下面的例子一样简单。 通过一切手段使用break !

for(int i = 0; i < 10; i++) { if(wereDoneHere()) { // we're done, break. break; } }

改变条件,在上述情况下, i和j的价值,你只是使代码真的难以阅读。 也有可能出现这样的情况,即上限(例子中的10)是variables,所以更难猜测为了退出循环而将其设置为什么值。 你当然可以设置i和j Integer.MAX_VALUE,但我认为你可以看到这开始变得凌乱得很快。

java如何停止函数循环_在Java中使用break来退出循环是不好的做法吗?相关推荐

  1. es6 依赖循环_探索 JavaScript 中的依赖管理及循环依赖

    我们通常会把项目中使用的第三方依赖写在 package.json 文件里,然后使用 npm .cnpm 或者 yarn 这些流行的依赖管理工具来帮我们管理这些依赖.但是它们是如何管理这些依赖的.它们之 ...

  2. JAVA有percentile函数吗_计算DAX中的PERCENTILE

    我找到了一种方法,可以通过一系列步骤打破计算,从而获得了一个非常快速的解决方案 . 为了计算表 Data 中 Amount Paid 的第10个百分位数,我遵循了下面的书外公式: Calculate ...

  3. python多线程处理循环_在python中使用线程运行无限循环

    据我了解你的问题,你有两个不同的任务,你希望他们连续执行.现在关于你的问题:我该如何运行两个无限循环? 您可以创建两个不同的线程来为您运行这些无限循环.第一个线程将执行您的task1,第二个线程将执行 ...

  4. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  5. python循环 break举例,python循环中使用break语句终止循环

    break语句是用来 终止 循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句. 一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else ...

  6. java lambda循环_使用Java 8 Lambda简化嵌套循环

    java lambda循环 对于每个经常需要在Java 8(或更高版本)中使用多维数组的人来说,这只是一个快速技巧. 在这种情况下,您可能经常会以类似于以下代码的结尾: float[][] value ...

  7. java while九九乘法表_用java实现三种方法循环输出九九乘法表:

    展开全部 for循环的结构:for(表达式 1:表达式 2:表达式  3) {  循环体  } 表达式 1:一般为赋值表达式:62616964757a686964616fe78988e69d83313 ...

  8. java打印args的内容_解决java main函数中的args数组传值问题

    这几天面试中有遇到关于main数组中的args数组传值的问题,一般是从命令提示符中传值,也可以直接在java代码中赋值. 而且这个数组的长度是动态的,根据传值的个数确定数组的长度. 1.从命令提示符中 ...

  9. java 实现画函数图像_函数图像生成器 [基于JAVA的图像生成器设计与实现]

    摘要:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java技术具有卓越的通用性.高效性.平台移植性和安全性.该文基于JAVA语言,在介绍JAVA概念的基础上,实现了图像生成器的简单设 ...

最新文章

  1. kafka的SASL的适用业务场景
  2. ssm(Spring+Spring mvc+mybatis)——web.xml
  3. Nodejs cqmanager项目
  4. matlab虚拟现实之V-Realm Builder2复制技巧(修改)
  5. 圣殿骑士的一篇关于WPF的培训好文,WPF应用与团队开发(转)
  6. 陈绪:7月24日阿里云上海峰会出品人
  7. 58 集团面向亿级用户 IM 长连接服务设计与实践
  8. python安装第三方库出现问题怎么办_关于Python第三方库安装失败问题的解决方案...
  9. hdu3966-线段树
  10. 如何快速入门Spring Cloud
  11. 服务器信息 sid,裸金属服务器SID配置
  12. 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
  13. python安装不了turtle,三种错误都一一解决
  14. 简述java异常机制处理,简述Java中异常处理的机制
  15. Socket一对一聊天实例
  16. 性能优化:Vue-ECharts使用CDN
  17. 逆战班-----javascript实现放大镜效果
  18. ensp启动设备蓝屏_超全超详细的电脑蓝屏问题解决方案汇总
  19. 概要数据结构(Sketch)
  20. php日历天气预报下载安装手机桌面_日历天气预报app下载

热门文章

  1. 使用IntelliJ, 让lombok生效的方式
  2. Fiori应用deploy到云上后在Chrome开发者工具里Source标签页的外观
  3. Mac终端给命令设置别名alias的办法
  4. python中0xf2_python入门(一)
  5. 慕课php进阶篇,PHP进阶篇-函数
  6. java 字符表 chr3,VBS CHR码值对应列表
  7. java实现聊天室界面javafx_java 聊天室WeChat
  8. addeventlistener事件第三个参数 passive_JS DOM 事件流、事件冒泡
  9. oracle 韩思捷_ORACLE数据库技术实用详解:教你如何成为10g OCP
  10. 鸿蒙安卓数据互通吗,假如鸿蒙与安卓之间不能够实现游戏账号互通,你还会为其买单吗?...