Search code examples
javajavac

URL in Java code compiles without error: Why is the javac compiler ignoring it?


I made a mistake while testing some code and forgot to delete a line that contained only a URL. The code looked something like this:

class Example {
    public static void main(String[] args) {
        https://example.com
        System.out.println("Example");
    }
}

I assumed that the compiler would fail because a non-Java code was present in the first line of the main method. However, the code compiled and worked fine.

I thought that everything after the // symbol was a comment and expected the following code to fail compilation:

https:
System.out.println("Example");

To my surprise, it compiled without error.

However, the following code produced a compile error, as expected:

class Example {
    public static void main(String[] args) {
        https://example.com
    }
}

Compiler error

/Example.java:4: error: illegal start of statement
    }
    ^
1 error

Can anyone explain why and under what circumstances the javac compiler ignores a line that contains a URL?

I compile the code online in https://www.jdoodle.com/ locally by hand and the behavior is the same always. I used Java8 and Java17.

I saw that the line is ignored because in intellij I could check in the decompiled code that the line is not there.


Solution

  • It is actually valid Java code:

        https://example.com
        System.out.println("Example");
    

    The https: is a label

    The // is a comment ... to the end of the line

    The System.out.println("Example"); is the statement that is labelled with https:

    Labelled statements are an obscure Java construct that is used in conjunction with the break to label statement. Here's a (marginally) useful example:

    out: while (true) {
            int i = Random.nextInt(10);
            while (true) {
                int j = Random.nextInt(10);
                if (i == j) break out;
            }
         }
    

    The break out; breaks the two while loops.


    Your second example is not valid Java because there isn't a statement after the label.