【Java】不正当使用break语句的危害
(這里是臨時(shí)打的,連IDE都沒開,但是建議不要隨便用Tab,在IDE里也要設(shè)置一下Tab->4*Space)
switch語句塊不使用break,導(dǎo)致一直執(zhí)行
其實(shí)圖1的代碼和下面的代碼運(yùn)行結(jié)果是一樣的……
switch (a) { case 1: case 2: defalut:System.out.println("1");System.out.println("2");System.out.println("3"); }for( ; ; )、while(true)等無限循環(huán)里面不使用break導(dǎo)致真正的“死循環(huán)”
//a為輸入的值 Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); int a = Integer.parseInt(a); for (;;) {if (a == 1) {//do something} else if (a == 2) {//do something} else {//do something (但是此時(shí)應(yīng)該退出,沒有使用break)} }結(jié)果就是死循環(huán)吶,不過這只是一個(gè)demo,一般人不會(huì)寫這種代碼……
不過我在寫那個(gè)置頂?shù)牟┪摹奶鞕C(jī)器人的時(shí)候那個(gè)系統(tǒng)就是有必要的退出和返回,依靠的就是從“無限循環(huán)”中跳出來,雖不見得是break,但思想是類似的。
不使用循環(huán)的“標(biāo)簽”,編譯器:我咋知道你想break哪個(gè)?
Java語法里允許給for循環(huán)上一個(gè)“標(biāo)簽”(while也有,最后面給一個(gè)demo):
public class BreakTest2 {public static void main(String[] args) {List<String> strList = new ArrayList<>();strList.add("a");strList.add("b");strList.add("c");outer:for (String s : strList) {for (int i = 0; i < 2; i++) {System.out.println(i);if ("b".equals(s)) {break outer;}}}} }運(yùn)行結(jié)果
0 1 0如果我們不加這個(gè)tag(outer):
public class BreakTest2 {public static void main(String[] args) {List<String> strList = new ArrayList<>();strList.add("a");strList.add("b");strList.add("c");for (String s : strList) {for (int i = 0; i < 2; i++) {System.out.println(i);if ("b".equals(s)) {break;}}}} }運(yùn)行結(jié)果
0 1 0 0 1顯然,只break了內(nèi)層循環(huán),編譯器不知道是想跳轉(zhuǎn)到外層循環(huán)以外……
凄慘……
親測(cè)之后補(bǔ)充一下,while循環(huán)也可以加tag:
測(cè)試結(jié)果
證明有效哇
注意:如果沒有特殊說明,編譯器默認(rèn)break只跳出當(dāng)前循環(huán)(最內(nèi)層)😉
補(bǔ)充
還有一些情況,比如某些算法例如線性的查找,找到以后(如果就是要找的唯一答案),break至少保證了一些較好的情況可能存在,否則只能把整個(gè)需要遍歷的部分掃描一遍(哪怕已經(jīng)找到了,可以break或者return),導(dǎo)致算法運(yùn)行時(shí)全是“最壞情況”。
總結(jié)
以上是生活随笔為你收集整理的【Java】不正当使用break语句的危害的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scrapy 爬虫框架初体验二 —— 以
- 下一篇: 合理抽象灵活运用排列组合(洛谷P2181