簡體   English   中英

如何跳入Java

[英]How to jump in java

我有這樣的代碼

public class Test
{

    public static void main(String[] args)
    {
        continue s;
        System.out.println("I am not supposed to print this");
        s:
        System.out.println("I am suppose to print this");

    }
}

我得到錯誤

java: undefined label: s

怎么了 ?

在Java中不可能像這樣跳躍,唯一的跳躍方式是從循環,while和do。

閱讀@Heinzi的答案

2.2.6沒有更多的Goto語句

Java沒有goto語句 研究表明,goto被(誤用)的原因不只是“因為它存在”而被更多地使用。 取消goto導致語言的簡化-例如,在for語句的中間沒有關於goto效果的規則。 對大約100,000行C代碼的研究確定,大約90%的goto語句僅用於獲得擺脫嵌套循環的效果。 如上所述,多級中斷並繼續刪除了對goto語句的大部分需求。

Java語言環境,James Gosling和Henry McGilton,1996年

Java中沒有“ goto”。 而“繼續”還有其他功能。 您可以在循環中使用“ continue”,例如:

class ContinueDemo {
    public static void main(String[] args) {

        String searchMe = "peter piper picked a " + "peck of pickled peppers";
        int max = searchMe.length();
        int numPs = 0;

        for (int i = 0; i < max; i++) {
            // interested only in p's
            if (searchMe.charAt(i) != 'p')
                continue;

            // process p's
            numPs++;
        }
        System.out.println("Found " + numPs + " p's in the string.");
    }
}

在上面的示例中,例如,如果searchMe.charAt(5) != 'p'則循環將從i = 6和numPs++;的循環開始處繼續numPs++; 將不會被處理。

您可以在此處閱讀有關此內容的更多信息: 分支語句

continue是Java中的關鍵字,用於跳過循環的迭代。 如果您試圖找到與GOTO等效的產品,則應重新考慮如何解決問題, GOTO永遠不是有效的選擇。

據我所知,Java中沒有goto(有一個關鍵字,但沒有任何意義)

基本上,在Java中沒有實際的方法可以做到這一點。 您似乎正在嘗試執行等效的“ goto”操作,而Java不支持該功能。 break labelcontinue label語句只能分支到封閉的帶標簽語句。

現在,根據Java正式語法,您可以編寫以下代碼:

  s: {
      continue s;
      System.out.println("I am not supposed to print this");
  }
  System.out.println("I am suppose to print this");

但這仍然無法編譯,原因有二:

  • 僅允許繼續分支到循環語句上的標簽。 break沒有那個限制...但是...)

  • continue (或break )使下一條語句不可訪問。

另請參見: Java中goto語句的替代方法


但是有一種相當棘手的方法可以使您的代碼“起作用”:

  static final boolean flag = true;  // class attribute ...

  ...

  s: {
      if (flag) break s;
      System.out.println("I am not supposed to print this");
  }
  System.out.println("I am suppose to print this");

編譯器將對“測試”進行評估,以使break實際上是無條件的。 但是JLS表示,第一個println將被視為可訪問的,因此您不會遇到無法訪問的代碼錯誤。

我想如果您生成此源代碼,這可能會很有用。 除此之外,這只是(IMO)的好奇心。 使用常規的if / else語句...或通過完全刪除第一個“打印”來進行此操作更為簡單。

從理論上講,Java具有Jump語句returnbreak

return語句會跳出一個方法,無論是否將值返回給調用語句。

break語句跳出循環。

正如前面的答案中提到的那樣, goto在Java中不可用,並且不被視為過程式或面向對象編程中的良好編程習慣。 它存在於順序編程時代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM