java continue goto_Java中goto和break、continue實現區別

goto 關鍵字很早就在程序設計語言中出現。事實上,goto 是匯編語言的程序控制結構的始祖:“若條件 A,

則跳到這里;否則跳到那里”。若閱讀由幾乎所有編譯器生成的匯編代碼,就會發現程序控制里包含了許多

跳轉。然而,goto 是在源碼的級別跳轉的,所以招致了不好的聲譽。若程序總是從一個地方跳到另一個地

方,還有什么辦法能識別代碼的流程呢?隨著 Edsger Dijkstra 著名的“Goto 有害”論的問世,goto 便從此

失寵。

事實上,真正的問題并不在于使用 goto ,而在于 goto 的濫用。而且在一些少見的情況下,goto 是組織控制

流程的最佳手段。

盡管 goto 仍是 Java 的一個保留字,但并未在語言中得到正式使用;Java 沒有 goto 。然而,在 break 和

continue 這兩個關鍵字的身上,我們仍然能看出一些 goto 的影子。它并不屬于一次跳轉,而是中斷循環語

句的一種方法。之所以把它們納入 goto 問題中一起討論,是由于它們使用了相同的機制:標簽。

“標簽”是后面跟一個冒號的標識符,就象下面這樣:

label1:

對 Java 來說,唯一用到標簽的地方是在循環語句之前。進一步說,它實際需要緊靠在循環語句的前方——在

標簽和循環之間置入任何語句都是不明智的。而在循環之前設置標簽的唯一理由是:我們希望在其中嵌套另

一個循環或者一個開關。這是由于 break 和 continue 關鍵字通常只中斷當前循環,但若隨同標簽使用,它們

就會中斷到存在標簽的地方。如下所示:

label1:

外部循環{

內部循環{

//...

break; //1

//...

continue; //2

//...

continue label1; //3

//...

break label1; //4

}

}

在條件 1 中,break 中斷內部循環,并在外部循環結束。在條件 2 中,continue 移回內部循環的起始處。但

在條件 3 中,continue label1 卻同時中斷內部循環以及外部循環,并移至 label1 處。隨后,它實際是繼續

循環,但卻從外部循環開始。在條件 4 中,break label1 也會中斷所有循環,并回到 label1 處,但并不重

新進入循環。也就是說,它實際是完全中止了兩個循環。

下面是 for 循環的一個例子:

// : LabeledFor.java

// Java’s "labeled for loop"

public class LabeledFor {

public static void main(String[] args) {

int i = 0;

outer: // Can't have statements here

for (; true;) { // infinite loop

inner: // Can't have statements here

for (; i < 10; i++) {

prt("i = " + i);

if (i == 2) {

prt("continue");

continue;

}

if (i == 3) {

prt("break");

i++; // Otherwise i never

// gets incremented.

break;

}

if (i == 7) {

prt("continue outer");

i++; // Otherwise i never

// gets incremented.

continue outer;

}

if (i == 8) {

prt("break outer");

break outer;

}

for (int k = 0; k < 5; k++) {

if (k == 3) {

prt("continue inner");

continue inner;

}

}

}

}

// Can't break or continue

// to labels here

}

static void prt(String s) {

System.out.println(s);

}

}

這里用到了在其他例子中已經定義的 prt()方法。

注意 break 會中斷 for 循環,而且在抵達 for 循環的末尾之前,遞增表達式不會執行。由于 break 跳過了遞

增表達式,所以遞增會在 i==3 的情況下直接執行。在 i==7 的情況下,continue outer 語句也會到達循環頂

部,而且也會跳過遞增,所以它也是直接遞增的。

下面是輸出結果:

i = 0

continue inner

i = 1

continue inner

i = 2

continue

i = 3

break

i = 4

continue inner

i = 5

continue inner

i = 6

continue inner

i = 7

continue outer

i = 8

break outer

如果沒有 break outer 語句,就沒有辦法在一個內部循環里找到出外部循環的路徑。這是由于 break 本身只

能中斷最內層的循環(對于 continue 同樣如此)。

當然,若想在中斷循環的同時退出方法,簡單地用一個 return 即可。

下面這個例子向大家展示了帶標簽的 break 以及 continue 語句在 while 循環中的用法:

//: LabeledWhile.java//Java's "labeled while" loop

public classLabeledWhile {public static voidmain(String[] args) {int i = 0;

outer:while (true) {

prt("Outer while loop");while (true) {

i++;

prt("i = " +i);if (i == 1) {

prt("continue");continue;

}if (i == 3) {

prt("continue outer");continueouter;

}if (i == 5) {

prt("break");break;

}if (i == 7) {

prt("break outer");breakouter;

}

}

}

}static voidprt(String s) {

System.out.println(s);

}

}///:~

同樣的規則亦適用于 while:

(1) 簡單的一個 continue 會退回最內層循環的開頭(頂部),并繼續執行。

(2) 帶有標簽的 continue 會到達標簽的位置,并重新進入緊接在那個標簽后面的循環。

(3) break 會中斷當前循環,并移離當前標簽的末尾。

(4) 帶標簽的 break 會中斷當前循環,并移離由那個標簽指示的循環的末尾。

這個方法的輸出結果是一目了然的:

Outer while loop

i = 1

continue

i = 2

i = 3

continue outer

Outer while loop

i = 4

i = 5

break

Outer while loop

i = 6

i = 7

break outer

大家要記住的重點是:在 Java 里唯一需要用到標簽的地方就是擁有嵌套循環,而且想中斷或繼續多個嵌套級

別的時候。

在 Dijkstra 的“Goto 有害”論中,他最反對的就是標簽,而非 goto 。隨著標簽在一個程序里數量的增多,

他發現產生錯誤的機會也越來越多。標簽和 goto 使我們難于對程序作靜態分析。這是由于它們在程序的執行

流程中引入了許多“怪圈”。但幸運的是,Java 標簽不會造成這方面的問題,因為它們的活動場所已被限

死,不可通過特別的方式到處傳遞程序的控制權。由此也引出了一個有趣的問題:通過限制語句的能力,反

而能使一項語言特性更加有用。

---------------------

作者:淡紫色呼吸

來源:CSDN

原文:https://blog.csdn.net/jinghuayuanli/article/details/16844765

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537991.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux VirtualBox安裝及使用指南

2019獨角獸企業重金招聘Python工程師標準>>> VirtualBox是一款虛擬機軟件。雖然它的功能并不及VMware Workstation Pro&#xff0c;但它對開源精神的堅持使得它在Linux中依然深受歡迎。 唯一難以令人接受的是&#xff0c;VirtualBox的安裝步驟較為復雜。不過&#x…

java web vm_java web .vm文件??

在JavaWeb項目中有很多.vm文件&#xff0c;打開以后是類似于.NETMVC項目中的.cshtml文件的形式#if($linkList)#set($itemsOnLine0)#foreach($linkin...在Java Web項目中有很多.vm文件&#xff0c;打開以后是類似于.NET MVC項目中的.cshtml文件的形式#if($linkList)#set ($items…

Android studio gradle 無法獲取 pom文件

Android studio 3.1 導入app項目后&#xff0c;gradle無法獲取 pom文件 具體保存內容如下&#xff1a; Could not GET https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-g…

生產環境linux下安裝兩個及兩個以上tomcat實踐

前言: 在生產環境部署程序項目中&#xff0c;有時候由于服務器緊張或缺少服務器等原因,往往都需要安裝兩個及兩個以上tomcat。我們需要在/etc/profile中增加tomcat的環境變量&#xff0c;然后在新增加的tomcat的bin目錄下的catalina.sh中引用自己在/etc/profile中配置的環境變量…

java 內存 四_java最終化的內存保留問題(4)

四、一種代替最終化的選擇在前面一節中的示例還存在一種不確定性可能&#xff1a;JVM并不能保證它在最終化隊列中調用對象的終結器的順序。而來自于所有類(應用程序&#xff0c;庫&#xff0c;等等)的終結器都是被同等對待的。因此&#xff0c;一個占有大量內存或一種稀有的本地…

基于Spring Boot不同的環境使用不同的配置方法

原文路徑&#xff1a;http://www.jb51.net/article/132589.htm ---------------------------------------- 默認是profile為dev&#xff0c;可以修改 spring 多文件配置&#xff1a; 1、properties文件 2、YAML文件 一、properties文件 在 Spring Boot 中&#xff0c; 多環境配…

java set方法賦值_java方面:private屬性,沒有set方法,只有get方法,如何給這個屬性賦值?...

富國滬深用反射吧&#xff0c;然后設置setAccessible為true就可以了&#xff0c;如下&#xff1a;public class Test {private String readOnly;public String getReadOnly() {return readOnly;}public static void main(String[] args) throws SecurityException, NoSuchField…

SpringBoot項目在IntelliJ IDEA中實現熱部署

spring-boot項目熱部署idea工具&#xff1a; &#xff08;1&#xff09;、pom文件引入&#xff1a;都需要為true<!-- 熱部署模塊 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId…

java nio 對消息分片_Java NIO:應用

Java NIO 是一種非阻塞的、面向塊而非字節的 IO 方式。雖然 Java 的傳統 IO 也進行了一些基于 NIO 的改造&#xff0c;NIO 仍然能夠帶來許多優勢。面向流的 IO 方便我們一個字節一個字節地處理數據&#xff0c;有利于實現過濾等功能&#xff0c;更加優雅和簡單。相應地&#xf…

使用Notepad++來比較文件

原文連接&#xff1a;https://blog.csdn.net/sanqima/article/details/50467154 -----------------------------------------------------------------------------Notepad&#xff0c;也叫npp&#xff0c;是一款類似于記事本的開源小軟件。它運行便攜&#xff0c;體積小、資源…

利用lamda函數 的函數式編程 實現scrapy審計外網安全問題

2019獨角獸企業重金招聘Python工程師標準>>> import scrapy from scrapy.spiders import Spiderdef parse_response(response, ip_in):title response.xpath("/html/head/title").extract()[0]filename quotes.txtwith open(filename, a) as f:f.write(…

Linux服務器上新增開放端口號

原文連接&#xff1a; https://blog.csdn.net/u012562106/article/details/52882666 ---------------------------------------開放端口的方法&#xff1a; 方法一&#xff1a;命令行方式 1. 開放端口命令&#xff1a; /sbin/iptables -I INPUT -p tcp --dport 8…

return ,continue,break的用法與區別總結

1、return 語句的作用 (1) return 從當前的方法中退出,返回到該調用的方法的語句處,繼續執行。 (2) return 返回一個值給調用該方法的語句&#xff0c;返回值的數據類型必須與方法的聲明中的返回值的類型一致&#xff0c;可以使用強制類型轉換來是數據類型一致。 (…

linux java -xms_為什么JVM比指定的-Xms消耗更少的內存?

我的問題是 Headers &#xff0c;我通過搜索獲得了一些知識&#xff1a;但還是不知道為什么&#xff0c;有些可以提供一些幫助嗎&#xff1f;這是我在Ubuntu12.04(64位)上的測試運行JDK 1.7.0_04 . 和頂部顯示如下&#xff1a;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME CO…

Jquery的一些方法

$.trim(str);說明&#xff1a;去掉字符串首尾空格。轉載于:https://www.cnblogs.com/gygtech/p/9552538.html

清除nginx服務器網站緩存數據

原文連接&#xff1a;https://blog.csdn.net/Crabime/article/details/51883028?locationNum2&fps1 -------------------------------------公司網站上線之后后面老是出現一些小的bug&#xff0c;但是這些bug在vi上改了之后打開更改的網頁卻發現并沒有更改&#xff0c;goo…

linux安裝指定版本python_ubuntu多版本python為指定版本python安裝庫

當安裝了多個版本的Python時&#xff0c;比如一個python2.7&#xff0c;一個python3.5&#xff0c;需要為某個python版本安裝庫時如何精準的指定python版本呢。網上多數回答都是用到pyenv、virtualenv之類&#xff0c;看了下感覺跟我的預期不一致。因為PyCharm已經可以管理多個…

Linux 如何通過某一臺服務器調用執行多臺遠程服務器上的腳本,結果顯示在本地?...

現在都流行自動化運維了&#xff0c;可能目前技術不夠&#xff0c;很多自動化工具還不怎么會用&#xff0c;所以本次只是通過ssh來實現功能。 說明&#xff1a;自己寫的一個簡單腳本&#xff0c;只是實現了基礎功能&#xff0c;還有待優化。 一共三臺機器&#xff1a; master&a…

linux下查看磁盤分區的文件系統格式

原文鏈接&#xff1a; https://www.cnblogs.com/youbiyoufang/p/7607174.html ------------------------------------------------------------------------- df -T 只可以查看已經掛載的分區和文件系統類型。 Filesystem Type 1K-blocks Used Available Use% Mounted on/dev/s…

ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)

Linux下mysql的安裝&#xff0c;真是不同Linux環境&#xff0c;各種問題。步驟&#xff1a; 1、暫停mysql服務 service mysqld stop2、設置mysql模式# mysqld_safe --usermysql --skip-grant-tables --skip-networking & 3、clone session&#xff0c;新窗口# mysql -u roo…