280

私はこれについて混乱しています。私たちのほとんどは、Java には goto ステートメントがないと言われています。

しかし、Java のキーワードの 1 つであることを発見しました。どこで使用できますか?使用できない場合、なぜJavaにキーワードとして含まれていたのですか?

4

23 に答える 23

240

James Gosling は、ステートメントをサポートする元の JVM を作成しましたgotoが、その後、この機能を不要として削除しました。不要である主な理由gotoは、通常、より読みやすいステートメント ( などbreak/continue) に置き換えるか、コードの一部をメソッドに抽出することで置き換えることができるためです。

出典: James Gosling、質疑応答セッション

于 2010-12-28T17:01:19.663 に答える
210

Java キーワード リストでキーワードが指定されていますgotoが、「未使用」とマークされています。

元の JVM ( @VitaliiFedorenko による回答を参照) にありましたが、その後削除されました。Java の新しいバージョンに追加される場合に備えて、予約済みのキーワードとして保持されていた可能性があります。

gotoリストになく、後で言語に追加された場合、その単語を識別子 (変数名、メソッド名など) として使用していた既存のコードは機能しなくなりますgoto。しかし、gotoはキーワードであるため、そのようなコードは現在コンパイルすることさえできず、既存のコードを壊すことなく、後で実際に何かを実行させることが可能です。

于 2010-03-30T12:33:57.280 に答える
157

キーワードは存在しますが、実装されていません。

私が考えることができる 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;
    }
}
于 2010-03-30T12:36:50.117 に答える
43

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

"キーワード const と goto は予約されていますが、現在は使用されていません。"

于 2010-03-30T12:32:40.980 に答える
30

したがって、言語設計者が必要性を感じた場合、それらはいつの日か使用される可能性があります。

また、これらのキーワードを持つ言語 (C、C++ など) のプログラマーがこれらのキーワードを誤って使用した場合、Java コンパイラーは有用なエラー メッセージを表示できます。

あるいは、プログラマーが goto を使用するのを止めるためだったのかもしれません :)

于 2009-08-26T12:40:02.483 に答える
21

これらは将来の使用のために予約されています (参照: Java 言語キーワード)

キーワード const と goto は予約されていますが、現在は使用されていません。

Java に goto ステートメントがない理由は、「The Java Language Environment」にあります。

Java には goto 文がありません。調査によると、goto は単に「そこにあるから」というよりも頻繁に (誤) 使用されています。goto を削除すると、言語が単純化されました。たとえば、for ステートメントの途中での goto の効果に関する規則はありません。約 100,000 行の C コードを調査した結果、goto ステートメントの約 90% が、ネストされたループから抜け出す効果を得るためだけに使用されていることが判明しました。前述のように、複数レベルのブレーク アンド コンティニューにより、goto ステートメントの必要性がほとんどなくなります。

于 2010-03-30T12:35:44.413 に答える
18

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
于 2013-04-11T10:53:16.397 に答える
10

gotoこの構造は、プログラマーがマシン コードやアセンブリ言語でプログラミングした時代の名残であることを理解することが重要です。これらの言語は非常に基本的であるため (各命令は1 つのことしか実行しないため)、プログラム制御フローは完全にgotoステートメントで行われます (ただし、アセンブリ言語では、これらはジャンプまたは分岐命令と呼ばれます)。

現在、C 言語はかなり低レベルですが、非常に高レベルのアセンブリ言語と考えることができます。C の各ステートメントと関数は、アセンブリ言語の命令に簡単に分解できます。C は現在、コンピューターをプログラムするための主要な言語ではありませんが、組み込みシステムなどの低レベルのアプリケーションでは依然として頻繁に使用されています。gotoC の機能はアセンブリ言語の機能を非常によく反映しているため、Cに含まれていることだけが理にかなっています。

Java が C/C++ の進化形であることは明らかです。Java は C と多くの機能を共有していますが、より多くの詳細を抽象化しているため、単に別の方法で記述されています。Java は非常に高水準の言語であるためgoto、関数、for、for each、while ループなどのより高水準の構造体がプログラム制御フローを実行する場合のように、低水準の機能を持つ必要はまったくありません。gotoある関数にいて、別の関数にラベルを付けたと想像してください。他の関数が戻るとどうなるでしょうか? この考えはばかげています。

gotoこれは、Java がステートメントをインクルードしているにもかかわらずコンパイルを許可しない理由を必ずしも答えているわけではありませんが、なぜgoto最初に低レベルのアプリケーションで使用されたのか、なぜそれが意味をなさないのかを知ることは重要です。 Java で使用されます。

于 2012-06-14T13:25:17.617 に答える
10

いいえ、goto使用されませんが、ラベルを定義して、ラベルまでループを残すことができます。breakまたはcontinueの後にラベルを使用できます。そのため、複数のループ レベルから飛び出すことができます。チュートリアルをご覧ください。

于 2010-03-30T12:39:18.327 に答える
10

サポートされていないため、goto何もしないキーワードや という名前の変数が必要なのはなぜgotoですか?

break label;andcontinue 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");
     }
}
于 2009-08-26T12:40:27.240 に答える
9

いいえ、ありがたいことにgoto、Java にはありません。

gotoキーワードは予約されているだけで、使用されていません (同じことが にも当てはまります) const

于 2010-03-30T12:32:38.057 に答える
7

いいえ、goto予約語ですが、Java では使用されません。についても同様ですconst。これらはどちらも C++ で使用されているため、おそらく予約されています。その意図は、Java に移行する C++ プログラマーを混乱させないようにすることと、Java の後のリビジョンでそれらを使用するオプションを維持することでした。

于 2010-03-30T12:34:09.773 に答える
3

gotoの良性の使用のほとんどを次のように置き換えることができることに注意してください

  • 戻る

  • 壊す

  • ラベルを破る

  • try-catch-finallyの中に投げる

于 2009-08-26T18:14:35.353 に答える
2

指摘されたように、Java にはありませんが、Sun がいつか Javagotoに追加したいと感じた場合に備えて、キーワードは予約されていました。goto彼らはコードをあまり壊さずに追加できるようにしたかったので、キーワードを予約しました。enumJava 5 ではキーワードが追加され、それほど多くのコードが壊れていないことに注意してください。

Java には がありませんがgoto、 のいくつかの使用法に対応するいくつかの構成体がgotoありbreakますcontinue。また、finally一種のねじれた と考えることができますgoto

于 2010-03-30T12:36:17.003 に答える
1

これは、あなたがしてはいけないことの1つと非常に考えられていますが、開発者の混乱を避けるために、おそらく予約語としてリストされています。

于 2010-03-30T13:28:55.447 に答える
1

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

Java には goto ステートメントがないと言われたら、だまされています。実際、Java は「ソース」コードの 2 つの層で構成されています。

于 2013-04-01T20:44:31.850 に答える
1

次のリンクを参照してください。すべての Java 予約語が表示され、どのバージョンが追加されたかがわかります。

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

goto は予約されていますが、現在は使用されていませんが、絶対に使用しないでください :)

于 2009-08-26T12:48:01.903 に答える
1

はい、可能ですが、C# ほど良くはありません (私の意見では、C# の方が優れています!)。goto が常にソフトウェアを曖昧にするという意見は、退屈でばかげています。悲しいことに、Java には少なくとも goto ケース xxx がありません。

次へジャンプ:

 public static void main(String [] args) {
   myblock: {
     System.out.println("Hello");
     if (some_condition)
       break myblock; 
     System.out.println("Nice day");
   }
   // here code continue after performing break myblock
   System.out.println("And work");
 }

後方にジャンプ:

 public static void main(String [] args) {
   mystart: //here code continue after performing continue mystart
   do {
     System.out.println("Hello");
     if (some_condition)         
       continue mystart; 
     System.out.println("Nice day");
   } while (false);
   System.out.println("And work");
 }
于 2020-09-16T17:20:13.823 に答える
1

同名変数の宣言を禁止する。

例えば int i = 0, goto;

于 2009-08-26T12:40:25.960 に答える
1

goto通常、コードが読みにくくなるため、私はどちらも好きではありません。ただし、その規則には例外があると思います (特にレクサーとパーサーに関しては!)

もちろん、プログラムをアセンブラーのようなものに変換してから、

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ですね。

于 2017-01-20T15:04:45.673 に答える
0

もちろんキーワードですが、ソースコードレベルでは使いません。

しかし、jasmin やバイトコードに変換されるその他の低レベル言語を使用する場合は、「goto」があります。

于 2016-09-25T14:43:54.687 に答える
-1

Java 言語では使用されませんが、JVM バイトコードでは使用されるためです。

于 2013-01-29T16:18:14.887 に答える