2009-05-27 7 views
4

Un collègue est tombé sur un code qui ressemblait à ceci et ne pouvait pas comprendre comment il pourrait jamais compiler:Comment ce code Java peut-il être compilé?

class FooClass { 
    public static void bar(String arg) { 
    System.out.println("arg = " + arg); 
    http://www.google.com 
    System.out.println("Done!"); 
    } 
} 

En fait, il y avait une URL aléatoire collé au milieu d'une méthode, mais javac fichait .

Nous nous sommes débrouillés alors je posterai la réponse si personne d'autre ne la découvre, mais j'ai pensé que c'était assez intéressant pour poster.

+0

BTW, il fonctionne en C# (et probablement en C++) aussi. – GalacticCowboy

+3

Une seule URL avec chaque protocole est cependant autorisée (une "http", une "https", une "ftp", etc.). javac est un peu difficile à ce sujet. –

Répondre

18

"http:" est interprété comme une étiquette. Ce qui suit est un commentaire de fin de ligne.

+2

break http; est juste une identité secrète d'une déclaration GOTO qu'ils continuent à dire est EVIL et ne fera pas partie de la langue. Je n'avais aucune idée qu'il y avait des étiquettes en Java ... bien que je ne veux pas dire que je considère GOTO et les étiquettes comme mal comme beaucoup d'autres ... –

2

Facile. La mise en évidence sur ce site montre pourquoi.

http: est une étiquette, comme dans break http;

//www.google.com est un commentaire.

2

http: est l'étiquette. // commence le commentaire.

5

Vous avez une étiquette

http: 

suivi d'un commentaire

//www.google.com 
2

"http:" est une étiquette, et la partie après le "//" est, bien sûr, un commentaire

1

Un autre exemple avec deux http: //

public class Main { 
    { 
     http://en.wikipedia.org/wiki/Hello_world_program 
     System.out.print("Hello "); 
    } { 
     http://java.sun.com/docs/books/tutorial/getStarted/application/index.html 
     System.out.println("World!"); 
    } 

    public static void main(String... args) { 
     new Main(); 
    } 
}