มีคำสั่ง goto ใน Java หรือไม่?


259

ฉันสับสนเกี่ยวกับเรื่องนี้ พวกเราส่วนใหญ่ได้รับการบอกว่าไม่มีคำสั่ง goto ใน Java

แต่ฉันพบว่ามันเป็นหนึ่งในคำหลักใน Java จะใช้ที่ไหน? หากไม่สามารถใช้งานได้ทำไมจึงรวมอยู่ใน Java เป็นคำหลัก


13
เพียงคำแนะนำ: ไม่เคยใช้ goto
lostiniceland

16
และจากนั้นก็จะมี '' ไปที่คำแถลงพิจารณาที่เป็นอันตราย 'พิจารณาที่เป็นอันตราย' และ '' ไปที่คำแถลงการณ์พิจารณาที่เป็นอันตราย "พิจารณาที่เป็นอันตราย VEEEEERY เวียนเกิดมส์นี้
Chris Charabaruk

70
'ไปที่' อยู่เสมอความชั่วร้าย - เหมือนใน 'ข้ามไปทำงาน' หรือ 'โรงเรียนไปที่';)
แอนเดรี Dolk

24
เหตุผลที่แท้จริงคือคำว่า "g ** o" ถือเป็นคำลามกในภาษาโปรแกรมส่วนใหญ่ นักออกแบบ Java กำลังปกป้องโปรแกรมเมอร์หนุ่มผู้บริสุทธิ์จากอิทธิพลที่ขัดข้อง (:-))
Stephen C

25
การตามล่าแม่มดกับโกโตะทำให้เกิดช่วงเวลาที่เลวร้ายที่สุดในชีวิตของฉัน ฉันเคยเห็นคนบิดรหัส C โดยการซ่อนการทำงานในฟังก์ชั่นใส่ตรรกะออกไร้สาระในหลายลูปซ้อนและอื่น ๆ ทำทุกรูปแบบของวิศวกรรมเกินจินตนาการเท่าที่จะหลีกเลี่ยงคนวิจารณ์รหัสของพวกเขาในการตรวจสอบรหัส กฎนี้พร้อมกับ "เจ้าต้องหลีกเลี่ยงผลตอบแทนหลาย" canard ถูกแช่ในเรื่องไร้สาระ มีบางครั้งที่โกโตะทำให้สิ่งที่บำรุงรักษาน้อยลง มีบางครั้งที่โกโตะทำให้สิ่งต่างๆไว้ได้มากขึ้น ฉันหวังเป็นอย่างยิ่งว่าการตามล่าแม่มดครั้งนี้จะเสียชีวิตในยุค 80

คำตอบ:


200

รายการ Java คำหลักที่ระบุgotoคำหลัก แต่ก็มีการทำเครื่องหมายว่า "ไม่ได้ใช้"

มันอยู่ใน JVM ดั้งเดิม (ดูคำตอบโดย @VitaliiFedorenko ) แต่ถูกลบออกแล้ว มันอาจจะถูกเก็บไว้เป็นคำหลักที่สงวนไว้ในกรณีที่มันจะถูกเพิ่มลงใน Java รุ่นที่ใหม่กว่า

หากgotoไม่ได้อยู่ในรายการและจะถูกเพิ่มเข้าไปในภาษาในภายหลังรหัสที่มีอยู่ซึ่งใช้คำgotoว่าเป็นตัวระบุ (ชื่อตัวแปรชื่อวิธีการ ฯลฯ ... ) จะแตก แต่เนื่องจากgotoเป็นคำหลักรหัสดังกล่าวจะไม่ได้รวบรวมในปัจจุบันและยังคงเป็นไปได้ที่จะทำให้มันทำอะไรบางอย่างในภายหลังโดยไม่ทำลายรหัสที่มีอยู่


29
This was probably done in case it were to be added to a later version of Java.อันที่จริงเหตุผลหลักคือแตกต่างกันเล็กน้อย (ดูคำตอบของฉันด้านล่าง)
Vitalii Fedorenko

2
นั่นเป็นข้อมูลที่ดีและน่าสนใจ แต่ก็ไม่ได้อธิบายว่าทำไมมันยังเป็นคำหลักที่สงวนไว้
โทมัส

@Thomas คุณไม่ได้อธิบายว่าทำไมถึงจองไว้ มันเป็นคำหลักดังนั้นจึงไม่สามารถใช้งานได้ในตอนนี้ หลังจากนั้นโกโตะสามารถเด้งขึ้นมาได้โดยไม่ทำให้เกิดปัญหา หากไม่ใช่คำที่สงวนไว้มันสามารถใช้เพื่อสร้างรหัส (int goto = 2;) ซึ่งจะพังถ้ามีการแนะนำ goto

230

James Gosling สร้าง JVM ดั้งเดิมด้วยการสนับสนุนgotoข้อความ แต่แล้วเขาก็ลบคุณสมบัตินี้โดยไม่จำเป็น เหตุผลหลักที่gotoไม่จำเป็นคือโดยปกติแล้วมันจะถูกแทนที่ด้วยคำสั่งที่อ่านได้ง่ายขึ้น (เช่นbreak/continue) หรือโดยการแยกส่วนของรหัสลงในวิธีการ

ที่มา: James Gosling, Q&A เซสชั่น


24
"... หรือโดยการแยกส่วนของรหัสเป็นวิธี" - ต้องเย็นมากโดยไม่ต้องกำจัดหางที่เหมาะสม
ชื่อที่ปรากฏ

45
บางครั้งฉลาดใช้goto เป็นวิธีที่ readyble มากที่สุดและมีความชัดเจนในการแสดงบางสิ่งบางอย่างเพื่อบังคับให้มันเป็นอะไรอื่นเป็นอย่างเลี่ยงไม่พ้นที่อ่านได้น้อย
Deduplicator

1
@Dupuplicator การใช้งานของ goto, รอบคอบเพราะอาจเป็นไปได้เสมอที่จะเกิดข้อผิดพลาด
Çelebi Murat

@Dupuplicator การใช้ goto ที่พิจารณาว่าเป็น pratice ที่ดีใน C ++ เท่านั้นที่ได้รับการสนับสนุนโดยตัวแบ่ง / ดำเนินการต่อ
ฤดูหนาว

2
ไปเป็นคำหลักที่สงวนไว้ใน Java นั้นยอดเยี่ยมเพราะมันป้องกันผู้คนจากการตั้งชื่อป้ายกำกับ "goto:"
ฤดูหนาว

147

มีคำหลักอยู่ แต่ไม่มีการใช้งาน

เหตุผลที่ดีเพียงข้อเดียวที่ใช้ goto ที่ฉันคิดได้คือ:

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

ใน Java คุณสามารถทำสิ่งนี้ได้:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}

1
@ Zoltánไม่ - มันเปลี่ยนเส้นทางรหัสไปยังฉลากขวาก่อนลูปแรก
assylias

21
@assylias ดีไม่มาก เลเบลเลเบลลูปด้านนอก จากนั้นbreak loopsหมายถึง "แยกออกจากวงที่เรียกว่าloops" outerบางทีในการหวนกลับเป็นชื่อที่ดีกว่าสำหรับฉลากที่อาจได้รับ
jonnystoten

8
"เหตุผลที่ดีเพียงข้อเดียวที่จะใช้ goto" โปรแกรมเล็ก ๆ ที่รวดเร็วและสกปรกที่ต้องการวนลูปไม่ จำกัด โดยไม่มีเงื่อนไขทำให้การใช้ goto เป็นไปอย่างยอดเยี่ยม การใช้while (true) {... }เกินกำลัง GOTO ถูกตีตราบ่อยครั้งเนื่องจากการใช้งานที่ไม่เหมาะสม แต่ฉันยืนยันว่าการเปรียบเทียบตัวอักษรแบบบูลที่ไม่จำเป็นนั้นแย่กว่า GOTO
Alexander - Reinstate Monica

1
ฉลากลูปไม่ควรอยู่หลังลูปหรือ
GC_

1
ฉันเพิ่งค้นพบว่าเทคนิคการติดฉลากนี้มีประโยชน์มากเมื่อใช้ร่วมกับcontinue LABEL;คำสั่ง ดังนั้นคุณสามารถดำเนินการต่อวงโกหกด้านนอก
infotoni91

43

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

"คำหลัก const และ goto ถูกสงวนไว้แม้ว่าจะไม่ได้ใช้ก็ตาม"


12
"ไม่ได้ลงนาม" ไม่ได้อยู่ที่นั่น! (ถอนหายใจ)
Matthieu

เหมาะสมเนื่องจากประเภทดั้งเดิมทั้งหมดใน Java มีการลงนาม
mwieczorek

1
@mwieczorek ไม่ทั้งหมด "ถ่าน" เป็นชนิดดั้งเดิมและไม่ได้ลงนาม
Sergey Krivenkov

29

ดังนั้นพวกเขาจึงสามารถใช้งานได้หนึ่งวันหากนักออกแบบภาษารู้สึกว่าต้องการ

นอกจากนี้หากโปรแกรมเมอร์จากภาษาที่มีคำหลักเหล่านี้ (เช่น C, C ++) ใช้คำเหล่านั้นโดยไม่ตั้งใจแล้วคอมไพเลอร์ Java สามารถให้ข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์

หรือบางทีมันก็แค่หยุดโปรแกรมเมอร์ที่ใช้ goto :)


ฟังก์ชัน goto ที่หายไปใน Java ควรมีเหตุผลเพียงพอที่จะไม่ใช้ goto - ไม่จำเป็นต้องจองเป็นคำหลัก ต่อไปนี้คุณตรรกะทุกอย่างจะเป็นคำหลักเนื่องจากมันอาจถูกใช้โดยภาษาอื่นและ / หรือนักออกแบบ Java สามารถใช้มันในอนาคต ...
stuXnet

1
ฉันไม่คิดว่าตรรกะของฉันหมายถึงทุกอย่างจะเป็นคำหลัก มีชุดคำหลักขนาดเล็กที่ใช้งานในภาษาการเขียนโปรแกรมจำนวนมากที่สามารถตรวจจับและจัดการได้อย่างมีประโยชน์ใน Java Java สงวนgotoและconstแสดงให้เห็นถึงมรดกของ C / C ++ แต่ยังคงไม่มีการใช้งาน (แม้ว่าจะมีการถกเถียงกันเกี่ยวกับการนำไปใช้หลัง) มีคู่ที่ชอบassertและenumไม่ได้จองไว้ในตอนแรก แต่น่าจะเป็นเพราะพวกเขาได้รับการปฏิบัติ แต่การเข้าใจถึงปัญหาหลังเหตุการณ์เป็นสิ่งมหัศจรรย์
dave

19

สงวนไว้สำหรับการใช้งานในอนาคต (ดู: คำหลักภาษา Java )

คีย์เวิร์ด const และ goto ถูกสงวนไว้แม้ว่าจะไม่ได้ใช้ก็ตาม

เหตุผลที่ว่าทำไมไม่มีคำสั่งกลับไปข้างในชวาสามารถพบได้ใน " จาวาสิ่งแวดล้อมภาษา ":

Java ไม่มีคำสั่ง goto การศึกษาแสดงให้เห็นว่าข้ามไปใช้ (mis) ใช้บ่อยกว่าไม่เพียง "เพราะมันมี" การกำจัด goto นำไปสู่การทำให้ภาษาง่ายขึ้น - ไม่มีกฎเกี่ยวกับผลกระทบของการข้ามไปสู่คำสั่งกลางตัวอย่างเช่น การศึกษาเกี่ยวกับรหัส C ประมาณ 100,000 บรรทัดระบุว่าประมาณ 90 เปอร์เซ็นต์ของคำสั่ง goto นั้นใช้อย่างหมดจดเพื่อให้ได้ผลของการแยกออกจากลูปซ้อน ดังที่ได้กล่าวไว้ข้างต้นการแบ่งหลายระดับและดำเนินการลบความต้องการงบ goto ส่วนใหญ่ต่อไป


gotoสงวนไว้ แต่ไม่ใช่เพื่อการใช้ในอนาคต
มาร์ควิสแห่ง Lorne

17

ตัวอย่างของวิธีใช้ป้ายกำกับ "ทำต่อ" ใน Java คือ:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

ผล:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1

10

สิ่งสำคัญคือต้องเข้าใจว่าการgotoสร้างนั้นเป็นส่วนที่เหลือจากวันที่โปรแกรมเมอร์เขียนโปรแกรมในรหัสเครื่องและภาษาแอสเซมบลี เนื่องจากภาษาเหล่านั้นเป็นภาษาพื้นฐาน (เช่นเดียวกับในแต่ละคำสั่งจะทำเพียงสิ่งเดียว ) ทำให้การควบคุมโปรแกรมเสร็จสมบูรณ์ด้วยgotoข้อความสั่ง (แต่ในภาษาแอสเซมบลีภาษาเหล่านี้จะเรียกว่าคำสั่งกระโดดหรือสาขา )

ตอนนี้ถึงแม้ว่าภาษา C จะค่อนข้างต่ำ แต่ก็สามารถคิดได้ว่าเป็นภาษาแอสเซมบลีระดับสูงมาก - แต่ละคำสั่งและฟังก์ชั่นใน C สามารถแบ่งออกเป็นคำแนะนำภาษาแอสเซมบลีได้ง่าย แม้ว่า C ไม่ใช่ภาษาหลักสำหรับโปรแกรมคอมพิวเตอร์ที่มีอยู่ทุกวันนี้ แต่ C ก็ยังคงใช้กันอย่างแพร่หลายในแอปพลิเคชันระดับต่ำเช่นระบบฝัง เนื่องจากฟังก์ชั่นของ C สะท้อนการทำงานของภาษาแอสเซมบลีอย่างใกล้ชิดจึงเหมาะสมที่gotoรวมอยู่ใน C เท่านั้น

เป็นที่ชัดเจนว่า Java เป็นวิวัฒนาการของ C / C ++ Java แบ่งปันคุณสมบัติมากมายจาก C แต่สรุปรายละเอียดได้มากมายและดังนั้นจึงถูกเขียนอย่างแตกต่างกัน Java เป็นภาษาระดับสูงมากดังนั้นจึงไม่จำเป็นต้องมีคุณสมบัติระดับต่ำเช่นgotoเมื่อโครงสร้างระดับสูงเช่นฟังก์ชันสำหรับแต่ละและในขณะที่ลูปทำโฟลว์ควบคุมโปรแกรม ลองนึกภาพถ้าคุณอยู่ในฟังก์ชั่นหนึ่งและทำgotoป้ายกำกับให้กับฟังก์ชั่นอื่น จะเกิดอะไรขึ้นเมื่อฟังก์ชันอื่นส่งคืน ความคิดนี้ไร้สาระ

นี่ไม่จำเป็นต้องตอบว่าทำไม Java จึงรวมgotoคำสั่งไว้ แต่จะไม่ยอมให้คอมไพล์ แต่สิ่งสำคัญคือต้องรู้ว่าทำไมgotoถูกใช้ตั้งแต่แรกในแอปพลิเคชันระดับต่ำกว่าและทำไมมันไม่สมเหตุสมผล ใช้ใน Java


"โฟลว์การควบคุมโปรแกรมเสร็จสมบูรณ์ด้วย goto" ก็ไม่ได้มีเงื่อนไขเสมอไป
Peter Mortensen

การกระโดดด้วย "goto" จากฟังก์ชั่นหนึ่งไปยังเลเบลในอีกฟังก์ชั่นก็เป็นไปไม่ได้ใน C / C ++ Goto ใน C / C ++ ถูก จำกัด ไว้ที่บล็อกฟังก์ชั่นเดียว
user2328447

"มันไม่จำเป็นที่จะต้องมีฟีเจอร์ระดับต่ำอย่าง goto เมื่อโครงสร้างระดับสูง" - จำ "ความจำเป็นและความพอเพียง" เป็นเพียง "ไม่จำเป็น" และไม่มีเหตุผล มีเหตุผลอะไร: "ไปที่" แทน "ระดับสูง" สำหรับ JMPs, BNEs และ Assembler ของ Assembler นั้นสมเหตุสมผลถ้าคุณต้องการข้ามไปยัง "รหัสที่สามารถเรียกใช้งานได้" แต่ Java นั้นเป็น bytecode และไม่ใช่ "executable" ;-)
reichhart

10

ไม่gotoไม่ได้ใช้ แต่คุณสามารถกำหนดป้ายกำกับและวนซ้ำไปยังป้ายกำกับได้ คุณสามารถใช้breakหรือcontinueตามด้วยป้ายกำกับ ดังนั้นคุณสามารถกระโดดได้มากกว่าหนึ่งระดับวนรอบ มีลักษณะที่กวดวิชา


9

ไม่ขอบคุณไม่มีgotoใน Java

gotoคำหลักที่สงวนไว้ แต่ไม่ได้ใช้ (เดียวกันจะไปสำหรับconst)


ฉันขอทราบความหมายที่สงวนไว้ที่นี่ได้ไหม หากใช้ goto และ const ในรหัสไม่ใช่วิธีปฏิบัติที่ดีทำไมพวกเขาจึงจอง คุณช่วยอธิบายได้มั้ย
Gopi

@Sri Kumar: ดูคำตอบของ @ applechewer มีอยู่ แต่ยังไม่ได้ใช้งาน
Valentin Rocher

1
@Sri Kumar: คำหลักที่สงวนไว้ป้องกันไม่ให้ใช้เป็นชื่อตัวแปรหรือคล้ายกัน ด้วยวิธีนี้คำสำคัญเหล่านี้สามารถนำไปใช้กับ Java เวอร์ชันอนาคตได้โดยไม่ต้องทำลายซอร์สโค้ดเก่า
Peter Di Cecco

8

เนื่องจากไม่รองรับและทำไมคุณต้องการgotoคำหลักที่ไม่มีชื่อgotoหรือตัวแปร

แม้ว่าคุณจะสามารถใช้งานbreak label;และcontinue label;งบอย่างมีประสิทธิภาพทำในสิ่งที่gotoไม่ แต่ฉันจะไม่แนะนำที่นี่

public static void main(String [] args) {

     boolean t = true;

     first: {
        second: {
           third: {
               System.out.println("Before the break");

               if (t) {
                  break second;
               }

               System.out.println("Not executed");
           }

           System.out.println("Not executed - end of second block");
        }

        System.out.println("End of third block");
     }
}

10
-1 เหตุใดฉันจึงไม่ได้รับอนุญาตให้มีตัวแปรหรือวิธีการที่ชื่อ goto?
Michael Borgwardt

4
เพราะมันมีความหมายในด้านการเขียนโปรแกรมซึ่งไม่สามารถใช้ได้กับ Java นอกจากนี้ยังเป็นตัวเลือกชื่อตัวแปรที่ไม่ดี
pjp

ตัวแปร 'การพิมพ์' จะใช้เพื่ออะไร คำที่คุณพูดถึงเป็นเหมือนชื่อวิธีมากกว่าตัวแปรหรือคำหลัก
pjp

3
-1: ก่อนอื่นเพียงเพราะ Java ไม่รองรับคำสั่งการควบคุมการไหล "goto" ไม่ได้หมายความว่าเป็นเหตุผลที่มีคำหลัก "goto" ที่ไม่ได้ทำอะไรเลย ประการที่สอง "goto" อาจเป็นชื่อตัวแปรที่ไม่ดี แต่อาจเป็นชื่อวิธีการที่ยอดเยี่ยมซึ่งเราไม่สามารถใช้ได้เพราะ "goto" เป็นคำหลัก ประการที่สามมี "break label" และ "Continue label" อยู่ด้วยเหตุผลที่ดีมากดังนั้น "ไม่แนะนำให้ใช้" นั้นไม่มีประโยชน์มาก และข้อที่สี่เนื่องจาก Sun บอกว่ามัน "ไม่ได้ใช้งานในปัจจุบัน" เป็นไปได้มากว่าหมายความว่าพวกเขาเคยวางแผนที่จะนำไปใช้ แต่ไม่ต้องการกำจัดคำหลักเมื่อพวกเขาตัดสินใจเป็นอย่างอื่น
Vojislav Stojkovic

2
@VojislavStojkovic นั่นเป็นเพียงการพูดคุยที่บ้าคลั่ง 1) นั่นคือสาเหตุที่มันไม่ทำอะไรเลยเพราะมันไม่รองรับ ตาม JLS The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.นี่หมายความว่า "เราไม่ได้ใช้งานดังนั้นถ้าคุณมาจากพื้นหลัง C ++ เราจะไม่ปล่อยให้คุณใช้เลย" 2) gotoเป็นชื่อวิธีที่แย่มาก ขอโทษ 3) แนะนำให้แบ่งและดำเนินการต่อ แต่ไม่แนะนำให้ใช้ในวิธีนี้ 4) "เป็นไปได้มากที่สุด"
corsiKa

7

ไม่gotoไม่ได้ใช้ใน Java แม้จะเป็นคำที่สงวนไว้ constเช่นเดียวกับที่เป็นจริงสำหรับ ทั้งสองนี้ใช้ใน C ++ ซึ่งอาจเป็นเหตุผลว่าทำไมพวกเขาจึงสงวนไว้ ความตั้งใจที่จะหลีกเลี่ยงความสับสนในการเขียนโปรแกรม C ++ เพื่อย้ายไปยัง Java และอาจเก็บตัวเลือกในการใช้พวกเขาในการแก้ไข Java ในภายหลัง


1
ฉันหวังว่าgotoจะไม่ได้รับการสนับสนุนในอนาคตอันใกล้อย่างน้อย;)
Bozho

6
@Bozho: ดีมันสามารถใช้สำหรับคุณสมบัติใหม่ที่แยบยลที่ไม่มีอะไรเกี่ยวข้องกับ "อันตราย" goto เก่า
Michael Borgwardt

3

โปรดทราบว่าคุณสามารถแทนที่การใช้ goto ที่เป็นพิษเป็นภัยส่วนใหญ่ได้

  • กลับ

  • หยุดพัก

  • ทำลายฉลาก

  • ลองเข้าไปจับในที่สุด


5
ไม่ควรใช้ข้อยกเว้นสำหรับการควบคุมการไหล
ChssPly76

13
ยกเว้นจะใช้สำหรับการควบคุมการไหล แต่ควรจะใช้เฉพาะสำหรับกรณีพิเศษ ตัวอย่างเช่นหนึ่งในการใช้งานของ goto ใน C คือการจัดการข้อผิดพลาดโดยเฉพาะอย่างยิ่งถ้าเกี่ยวข้องกับการล้างข้อมูล
starblue

2
@starblue คุณเอาคำพูดออกมาจากปากของฉัน การขว้างข้อยกเว้นคือการควบคุมการไหล ใน C จริง ๆ แล้วคุณสามารถใช้การจัดการข้อยกเว้นผ่าน setjmp / longjmp ได้อย่างเรียบร้อยโดยตรวจสอบให้แน่ใจว่าคุณตั้งค่า jjj เป็นครั้งแรกกับรหัสการจัดการ

ฉันต้องการตรวจสอบถ้าและข้ามครึ่งหนึ่งของวิธีการถ้าเป็นจริง โดยไม่ต้องไปฉันจะต้องใช้ยักษ์อื่น IMO มันน่าเกลียดมากเพราะ paranthesis สร้าง confusions มากเกินไป
WVrock

1
@WVrock คุณสามารถลองreturn
Andrew Lazarus

2

ดังที่ได้กล่าวไว้แล้วว่าไม่มีgotoใน Java แต่คำหลักนั้นถูกสงวนไว้ในกรณีที่ Sun รู้สึกอยากgotoจะเพิ่มใน Java หนึ่งวัน พวกเขาต้องการที่จะเพิ่มได้โดยไม่ทำลายรหัสมากเกินไปดังนั้นพวกเขาจึงสงวนคำหลักไว้ โปรดทราบว่าด้วย Java 5 พวกเขาเพิ่มenumคำหลักและมันก็ไม่ได้ทำลายรหัสมากเช่นกัน

แม้ว่า Java จะไม่มีgotoแต่ก็มีโครงสร้างบางอย่างที่สอดคล้องกับประเพณีบางอย่างของgotoความสามารถในการbreakและcontinueมีลูปที่มีชื่อ นอกจากนี้ยังอาจจะคิดว่าเป็นชนิดของการบิดfinallygoto


1

ห้ามการประกาศตัวแปรที่มีชื่อเหมือนกัน

เช่น int i = 0, goto;


3
แต่ทำไม ? ทำไมเราไม่อนุญาตให้ทำการประกาศเหล่านี้
ApproachDarknessFish

1

มันถือว่าเป็นหนึ่งในสิ่งที่คุณห้ามทำ แต่อาจถูกระบุว่าเป็นคำที่สงวนไว้เพื่อหลีกเลี่ยงความสับสนสำหรับผู้พัฒนา


1

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto

หากคุณได้รับแจ้งว่าไม่มีคำสั่ง goto ใน Java คุณจะถูกหลอก ที่จริงแล้ว Java นั้นประกอบด้วยโค้ด 'ซอร์ส' สองชั้น


5
มันก็เหมือนกับการพูดว่าภาษาใดก็ตามมีการข้ามไปเพราะมีสาขาที่ไม่มีเงื่อนไขในรหัสการประกอบภายใต้มันทั้งหมด การมี goto ในโค้ดไบต์ไม่ได้หมายความว่ามี goto ใน java เพราะ "ใน java" หมายถึง "ในภาษา java" และรหัสไบต์ไม่ใช่เลเยอร์ของแหล่งที่มา

@ tgm1024 "ใน Java" สามารถตีความได้ว่า "ในแพลตฟอร์ม Java" คอมไพเลอร์ Java ต้องการสร้าง Java bytecode หรือเอาต์พุตจะไม่ทำงานในแพลตฟอร์ม Java JVM ตัวอย่างเช่น C ++ ไม่ได้ระบุเอาท์พุทการคอมไพล์และคอมไพเลอร์มีอิสระในการผลิตรหัสเครื่องในรูปแบบใด ๆ (หรือรหัสอื่น ๆ ) แอปพลิเคชัน Java bytecode ที่ตั้งโปรแกรมไว้สามารถเรียกว่า "แอปพลิเคชัน Java" แต่แอปพลิเคชันที่ตั้งโปรแกรมด้วยรหัสเครื่องไม่สามารถเรียกว่า "แอปพลิเคชัน C ++"
Mikael Lindlöf

2
ฉันรู้ดีว่า java bytecode คืออะไร ฉันได้รับการเข้ารหัสครั้งแรกใน java ในปี 1996 และคุณสามารถให้ภาษาอื่นสร้าง java bytecode สำหรับ JVM ที่ฉันกำลังแก้ไขคุณคือความคิดนี้ว่ามีสองชั้นของแหล่งที่มา ไม่มี. คุณมีแหล่งที่มาของจาวาและสิ่งนี้ถูกคอมไพล์ไปยังโค้ดจาวาไบต์ (ดำเนินการโดย JVM) และนี่ไม่ใช่เลเยอร์เพิ่มเติมของแหล่งที่มา เพียงเพราะมี "goto" ในรหัสไบต์ไม่ได้หมายความว่ามี "goto" ใน java Java มีชื่อตัวแบ่งและชื่ออย่างต่อเนื่อง แต่ไม่มีข้ามไป

@ tgm1024 ฉันถูกปลุกให้ตื่นด้วยการลงคะแนน :) ดูเหมือนว่าฉันจะทำเรื่องโต้แย้งตั้งแต่คุณแสดงความคิดเห็นล่าสุดและข้อมูลประจำตัวของคุณน่าประทับใจ จุดของฉันซึ่งฉันกำลังสร้างขึ้นก็คือว่ามันเป็นไปได้มากในการเขียนโปรแกรมด้วย Java bytecode เพื่อรับรองคุณนี่คือคำถามเกี่ยวกับเรื่องนี้: stackoverflow.com/questions/3150254/ …
Mikael Lindlöf

1

ดูลิงค์ต่อไปนี้จะแสดงคำที่สงวนไว้ทั้งหมดของ Java และบอกคุณว่ามีเวอร์ชันใดบ้างที่เพิ่มเข้ามา

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

goto ถูกจองถึงแม้ว่ามันจะไม่ได้ใช้ในปัจจุบันก็ตามอย่าพูดเลยว่า :)


1

ฉันไม่ได้เป็นแฟนของgotoทั้งสองเพราะมันมักจะทำให้อ่านรหัสน้อย อย่างไรก็ตามฉันเชื่อว่ามีข้อยกเว้นสำหรับกฎนั้น (โดยเฉพาะเมื่อพูดถึง lexers และ parsers!)

แน่นอนคุณสามารถนำโปรแกรมของคุณเข้าสู่ Kleene Normalform โดยการแปลเป็นแอสเซมเบลอร์จากนั้นเขียนสิ่งที่ชอบ

int line = 1;
boolean running = true;
while(running)
{
    switch(line++)
    {
        case 1: /* line 1 */
                break;
        case 2: /* line 2 */
                break;
        ...
        case 42: line = 1337; // goto 1337
                break;
        ...
        default: running = false;
                break;
    }
}

(โดยทั่วไปคุณเขียน VM ที่รันรหัสไบนารี่ของคุณ ... ซึ่งlineตรงกับตัวชี้คำสั่ง)

มันอ่านได้ง่ายกว่าโค้ดที่ใช้gotoใช่ไหม


คำถามถัดไป "มีคำสั่งสวิตช์ใน Python หรือไม่"
Mark K Cowan

0

แน่นอนมันเป็นคำหลัก แต่ไม่ได้ใช้กับระดับของซอร์สโค้ด

แต่ถ้าคุณใช้ jasmin หรือภาษาระดับต่ำกว่าอื่นซึ่งเปลี่ยนเป็น bytecode แล้ว "goto" จะมี


-1

เนื่องจากถึงแม้ว่าภาษา Java ไม่ได้ใช้งาน JVM bytecode ก็ทำเช่นนั้น


7
ถ้าเช่นนั้นทำไมภาษาถึงไม่มีloadคำค้นหา
ApproachingDarknessFish

3
@gribnit การมีการข้ามไปใน bytecode ไม่ได้มีความหมายสำหรับคำที่สงวนไว้ในระดับสูง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.