2016-01-03 7 views
22

Wenn Sie ein Programm wie dieses:Warum kompiliert eine HTTP-URL in Java?

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

Beachten Sie die URL http://example.com zwischen den beiden Ausgabeanweisungen geschrieben.

Warum kompiliert das Programm ohne Fehler?

+1

Ich habe mich auch darüber gewundert, als einmal die Verbindung zwischen Zeilen geschrieben und vergaß '//', Etiketten sind lustig :) – coolguy

+0

Ich erinnere mich an diesen Trick von Java 1.0 Ich lernte an der Universität, leider habe ich nur eine schwer zerschlagen "Core Java" für 1.1 statt 1.0: P suchte nach Betrogenen, konnte aber keine finden. –

+0

Nicht sicher, warum es doppelt markiert wurde. Die Frage ** Java Label Usage ** hat eine andere Frage und ihre Antworten beziehen sich auf diese Frage. Es wurde auch ein Duplikat einer Frage markiert, die selbst ein Duplikat ist! :/ – Hackerdarshi

Antwort

36

Der Grund, warum das Programm kompiliert ohne Fehler ist, dass das Programm http: als eine Bezeichnung, die in Java erlaubt ist, und wird meist mit Schleifen verwendet.
Der zweite Teil, d.h. //example.com, ist aufgrund der // ein Kommentar und wird daher vom Compiler ignoriert.

Daher kompiliert es richtig.

+4

Immer noch eine schlechte Form, sollte erwähnt werden. –

+4

Darf ich diese Art von "Ich stelle eine Frage und antworte sofort" machen? oO Ähm ... OP hat dies in ein paar seiner Fragen auf dieser Seite getan ... – Flocke

+1

@Flocke ja, es ist okay auf dieser Seite :) – coolguy

18

Wie in this Antwort beschrieben, kompiliert dieser Code, weil Java-Compiler denkt, dass http: ein Label ist und alles nach // ist ein Kommentar.

Darüber hinaus wird dies nicht kompilieren:

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

Und diese werden nicht:

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

aber dies wird:

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

Und dies wird:

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

Und:

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

So können Sie nicht die Variable nach dem Label deklarieren. Auch Intellij IDEA zeigt einige Warnungen mit Code wie diesem.

+0

Bitte schreiben Sie entweder eine vollständige Antwort oder integrieren Sie die Beispiele in die vorhandene Antwort. –

+1

@coolguy Sie sollten Ihre Antwort nicht löschen. Es bietet einige gute Beispiele, weshalb es upvoted ist. :) – Hackerdarshi

+0

Beachten Sie, dass Sie http://stackoverflow.com/a/5058025/1074998 und http://stackoverflow.com/a/8145704/1074998 finden können, um zu erfahren, warum die Deklaration nicht zulässig ist. –

1

Sieht aus wie Compiler nur Anweisungen nach Beschriftungen akzeptieren. Daher sind reservierte Schlüsselwörter und Klassennamen nicht zulässig. Aber es gibt eine Ausnahme von dieser Regel.

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

und dann:

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

kompiliert.

+0

Es funktioniert nur mit anonymen Klassen? Könnten Sie das bitte klären? – coolguy

+1

Es ist nichts ungewöhnliches daran. Sie können Anweisungen kennzeichnen, aber Sie können keine Deklarationen kennzeichnen. Was Sie in Ihrem Beispiel haben, ist keine Deklaration. –