On Fri, 16 May 2025 10:10:17 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> A consider class like this:
>> 
>> 
>> public class TwoMains {
>>     private static void main(String... args) {}
>>     static void main() {
>>         System.out.println("Should be called, but is not.");
>>     }
>> }
>> 
>> 
>> The `MethodFinder` will do lookup for the `main(String[])` method, and it 
>> finds one, so does not proceed with a lookup for `main()`. But then, it will 
>> check the access modifier, and will reject that method, never going back to 
>> the `main()` method. This is not what the JLS says about the lookup - the 
>> private method is not a candidate, and should be ignored.
>> 
>> Something similar happens if the return type is not `void`.
>> 
>> This PR is fixing that by checking whether the `main(String[])` method is 
>> usable early, and falling back to `main()` if it `main(String[])` is not 
>> usable.
>> 
>> It also removes the check for the `abstract` method, as that, by itself, is 
>> not really backed by JLS, but adds a check for `abstract` class, producing a 
>> user-friendly message is trying to invoke an instance `main` method on an 
>> `abstract` class (which, obviously, cannot be instantiated).
>
> src/java.base/share/classes/sun/launcher/resources/launcher.properties line 
> 283:
> 
>> 281:     make inner class static or move inner class out to separate source 
>> file
>> 282: java.launcher.cls.error8=\
>> 283:     Error: abstract class {0} can not instantiated\n\
> 
> Nit - should this use a comma instead of the newline?

The other errors here provide some advice on the second line, so I kept that 
pattern for this error as well. So, the newline is intentional.

> src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties
>  line 113:
> 
>> 111: # 0: string
>> 112: launcher.err.cant.find.main.method=\
>> 113:     can''t find main(String[]) or main() method in class: {0}
> 
> Out of curiosity, why the double single quotes? I see it being used in other 
> messages in this file as well, so it doesn't seem to be a typo.

Pieces of text in `MessageFormat` can be quoted using `'...'`. So, a single `'` 
does not work, as that is considered to be part of quoting. Using `''` escapes 
that behavior.

> test/jdk/tools/launcher/Arrrghs.java line 635:
> 
>> 633:         tr.contains("Error: abstract class Foo can not instantiated");
>> 634:         if (!tr.testStatus)
>> 635:             System.out.println(tr);
> 
> Hello Jan, I think this is pre-existing, but it looks like we don't fail the 
> test even when `tr.testStatus` indicates a failure? We seem to only write out 
> to `System.out` and return from the test method. Am I misreading the test 
> code?

`tr.contains` marks the test as failing, and eventually `TestHelper.main` will 
fail the test. It is probably not how I would write the test from scratch, but 
re-writing an already existing test also does not seem like a good option.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/25256#discussion_r2092836696
PR Review Comment: https://git.openjdk.org/jdk/pull/25256#discussion_r2092838074
PR Review Comment: https://git.openjdk.org/jdk/pull/25256#discussion_r2092835532

Reply via email to