Ошибка: не могу найти метод main(String[]) в классе:JAVA

Программисты JAVA общаются здесь
Anonymous
Ошибка: не могу найти метод main(String[]) в классе:

Сообщение Anonymous »

В Java-скрипте shebang я получаю эту сумасшедшую ошибку: не могу найти метод main(String[]) в классе: gomad.MyKotlin и первый вопрос, который я задаю себе это: «ПОЧЕМУ он ищет метод main() в этом классе?» (UPD Ну, это воспроизводится, когда Java компилирует и запускает однофайловую программу.)

Код: Выделить всё

#!/usr/bin/java --source 11

package gomad;

import java.util.Arrays;
import java.util.function.Consumer;
import java.util.stream.Collectors;

import static gomad.MyKotlin.*;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
int[] x = MyArrays.sorted(3, 14, 15, 92, 6, 53, 58, 97, 93, 2, 38, 4, 62, 6, 43);
System.out.println(Arrays.stream(x).boxed().collect(Collectors.toList()));
}
}

class MyKotlin { // the idea of also() comes from Kotlin
static  T also(T obj, Consumer action) {
action.accept(obj);
return obj;
}
}

class MyArrays {
static int[] sorted(int ... xs) {
return also(xs, Arrays::sort);
}
}
В случае этого скрипта появляется сообщение об ошибке: не удалось найти метод main(String[]) в классе: gomad.MyKotlin.Когда эта программа запускается из IntelliJ Idea с закомментированными she-bang, все работает.
Важно отметить, что когда эта программа запускается как Java Main. java, та же бессмысленная ошибка: не удается найти метод main(String[]) в классе: появляется gomad.MyKotlin.
Но если вы попытаетесь запустить его как javac gomad/Main .java && java gomad.Main, вы получите ожидаемый результат, без ошибок.

Код: Выделить всё

$ /usr/lib/jvm/java-21-openjdk-amd64/bin/java Main.java
error: can't find main(String[]) method in class: gomad.MyKotlin
$ /usr/lib/jvm/java-21-openjdk-amd64/bin/java -version
openjdk version "21.0.2" 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.2+13-Ubuntu-122.04.1, mixed mode, sharing)
И это не имеет ничего общего с Kotlin, за исключением того, что метод Too() заимствован из Kotlin.
Ребята, я знаю, что это похоже на дубликат, но это не так. В других обсуждениях говорится, что класс с main() должен быть объявлен первым (и это правда), и что следует использовать javac, а затем java, что не совсем так, как она делает. скрипты работают. Это стиль вопросов и ответов, и я публикую свое решение вместе с этим вопросом. Если вы знаете, почему это происходит и как этого можно избежать, не отказываясь от использования некоторых языковых конструкций, поделитесь своим мнением.

Подробнее здесь: https://stackoverflow.com/questions/781 ... d-in-class

Вернуться в «JAVA»