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). ------------- Commit messages: - 8357016: Candidate main methods not computed properly Changes: https://git.openjdk.org/jdk/pull/25256/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25256&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8357016 Stats: 129 lines in 8 files changed: 103 ins; 10 del; 16 mod Patch: https://git.openjdk.org/jdk/pull/25256.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/25256/head:pull/25256 PR: https://git.openjdk.org/jdk/pull/25256