Ошибка JNL после переустановки JDK несколько раз - PullRequest
0 голосов
/ 27 октября 2019

Привет, я новичок в Java, я пытаюсь начать в нем, но когда я пытаюсь запустить свой сценарий hello world, я сталкиваюсь с этой ошибкой. Я накачал эту ошибку в Google и возвращаюсь с 7-летним ответом переполнения стека, говоря о версиях, которые совместимы, а что нет. Итак, я попытался удалить и вернуться к версии, но тогда, по-видимому, мне нужно войти в систему и указать название компании в случае выставления счета? Я не уверен, но в любом случае я не могу этого сделать. Поэтому я переустанавливал всю Java. Вот что у меня есть в java-версии:

java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode)

После этого я удалил файл, скомпилированный ранее, и попытался снова. Кажется, что скомпилировать файл не проблема, но затем, когда я пытаюсь запустить его, я все равно получаю.

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: MyClass has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Если это имеет значение, это то, как выглядит мое заявление hello world.

public class MyClass {
  public static void main(String args[]) {
    System.out.println("Hello World");
  }
}

Я сделал это так, как показано в руководстве, так что я не думаю, что проблема есть, но я все еще новичок, поэтому любая помощь очень ценится.

1 Ответ

1 голос
/ 27 октября 2019

Проблема в том, что ваша среда выполнения Java - это версия 8, а ваш компилятор - версия 13, следовательно, несовместимость. Если вы запустите javac -version, он скажет вам что-то вроде javac 13.0.1. Вы должны проверить, что вы удаляете Java 8 и используете только среду выполнения, прилагаемую к вашему JDK. Тогда несовместимость версий должна быть устранена.

В качестве альтернативы вы можете добавить --release 8 к вашему вызову компилятора. Это скажет компилятору Java 13 создать байт-код, совместимый с Java 8.

Например, рассмотрим следующий класс:

public class Main{
    public static void main(String[] args) {
        System.out.println("Hello world!");
        System.out.println("Running on Java version " 
           + System.getProperty("java.version"));
    }
}

Затем скомпилируем его без дополнительных флагов:

> jdk13/bin/javac .\Main.java

и запустите его на Java 13:

> jdk13/bin/java Main
Hello world!
Running on Java version 13.0.1

и на Java 8:

> jdk8/bin/java Main
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Main has been compiled by a more
recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only
recognizes class file versions up to 52.0
...

, который вылетает, как и ожидалось.

Теперь скомпилируйте его с помощьюфлаг release:

> jdk13/bin/javac --release 8 .\Main.java

и повторите тест:

> jdk8/bin/java Main
Hello world!
Running on Java version 1.8.0_192

> jdk13/bin/java Main
Hello world!
Running on Java version 13.0.1

Все работает нормально.

...