2016-01-03 15 views
22

あなたはこのようなプログラムがある場合:JavaのHTTP URLがコンパイルされるのはなぜですか?

public class ABC 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("1"); 
     http://example.com 
     System.out.println("2"); 
    } 
} 

注2つの出力文の間に書かれたURL http://example.comを。

なぜプログラムはエラーなくコンパイルされますか?

+1

私は一度だけ行間のリンクを書いて、 '//'を忘れてしまったときには、ラベルは面白いです:) – coolguy

+0

Java 1.0からこのトリックを覚えています。大学で学んだ、残念ながら私は重い1.0の代わりに1.1のための "コアJava"を撃墜しました:P冗談を探しましたが、見つかりませんでした。 –

+0

重複してマークされた理由がわかりません。 ** Java Label Usage **の質問には別の質問があり、その答えはその質問に関連しています。また、それはそれ自体が重複している質問の重複とマークされました! :/ – Hackerdarshi

答えて

36

プログラムがエラーなしでコンパイルされる理由は、プログラムがhttp:をラベルと見なすためです。これはJavaでは許可されており、ほとんどループで使用されます。
//example.comの2番目の部分は、//のコメントであり、コンパイラによって無視されます。

したがって、正しくコンパイルされます。

+4

まだ悪い言い方があります。 –

+4

この種の「質問をしてすぐに答える」ことは許されていますか? 'あなたの回答:オブジェクト指向AHM ... OPは、はい、それはこのサイトでも大丈夫です:) – Flocke

+1

@Flockeをこれをしました自分の質問 - あなたの知識、Q&Aスタイルを共有します。私はそれに目を向け、それをした。これは、このように私の最初の質問です@Flocke – coolguy

18

this答えに記載されているように、Javaコンパイラはhttp:がラベルであり、//以降のすべてがコメントであると判断してこのコードをコンパイルします。

System.out.println("1"); 
http://example.com 
int i = 1; 

をそして、これはしません:

また、これはコンパイルされません

System.out.println("1"); 
http://example.com 
Date date = new Date(); 

をしかし、これは以下となります。

System.out.println("1"); 
int i; 
http://example.com 
i = 1; 

そして、これは以下となります。

int i = 0; 
System.out.println("1"); 
http://example.com 
i = i + 1; 

そして、この:

int i = 0; 
System.out.println("1"); 
http://example.com 
i++; 

ですから、ラベルの後に変数を宣言することはできません。 また、Intellij IDEAはこのようなコードでいくつかの警告を表示します。

+0

完全な答えを書くか、既存の回答に例を統合してください。 –

+1

@coolguyあなたはあなたの答えを削除しないでください。それはいくつかの良い例を提供しています。 :) – Hackerdarshi

+0

宣言が許されない理由を知るには、http://stackoverflow.com/a/5058025/1074998およびhttp://stackoverflow.com/a/8145704/1074998を参照することができます。 –

1

ラベルの後のステートメントのみを受け入れるコンパイラのように見えます。したがって、予約されたキーワードとクラス名は許可されません。しかし、このルールには例外があります。

interface PrintSome { 
    default void print() { 
     System.out.println("I`m printing some!"); 
    } 
} 

、その後:

http://www.example.com 
new PrintSome(){}.print(); 

がコンパイルされます。

+0

匿名クラスでのみ動作しますか?これを明確にしていただけますか? – coolguy

+1

これは珍しいことは何もありません。ステートメントにラベルを付けることはできますが、宣言にラベルを付けることはできません。あなたの例であなたが持っているものは、宣言ではありません。 –

関連する問題