java.lang.UnsupportedClassVersionError: неверный номер версии в файле класса [дубликат]

Мои 2 цента ... Я так понимаю. (Не стесняйтесь исправить меня, если я ошибаюсь)

Пришло время выбросить все, что вы знаете о прохождении по значению / ссылке.

Поскольку в JavaScript не имеет значения, передается ли оно по значению или по ссылке или что-то еще. Важна мутация против назначения параметров, переданных в функцию.

Хорошо, позвольте мне изо всех сил объяснить, что я имею в виду. Допустим, у вас есть несколько объектов.

var object1 = {};
var object2 = {};

То, что мы сделали, это «назначение» ... Мы назначили 2 отдельных пустых объекта для переменных «object1» и «object2».

Теперь скажем, что нам нравится object1 лучше ... Итак, мы «назначаем» новую переменную.

var favoriteObject = object1;

Далее, по какой-то причине мы решили, что нам нравится объект 2 лучше. Итак, мы просто немного переустановили.

favoriteObject = object2;

Ничего не случилось с object1 или object2. Мы вообще ничего не изменили. Все, что мы сделали, было переназначением того, что наш любимый объект. Важно знать, что объекты object2 и favoriteObject назначаются одному и тому же объекту. Мы можем изменить этот объект с помощью любой из этих переменных.

object2.name = 'Fred';
console.log(favoriteObject.name) // logs Fred
favoriteObject.name = 'Joe';
console.log(object2.name); // logs Joe 

OK, теперь давайте посмотрим на примитивы, такие как строки, например

var string1 = 'Hello world';
var string2 = 'Goodbye world';

Опять же, мы выбираем любимую.

var favoriteString = string1;

Обе наши переменные favoriteString и string1 присваиваются «Hello world». Теперь, что, если мы хотим изменить наш любимыйString ??? Что произойдет ???

favoriteString = 'Hello everyone';
console.log(favoriteString); // Logs 'Hello everyone'
console.log(string1); // Logs 'Hello world'

Э-э ... Что случилось. Мы не можем изменить string1, изменив функцию favoriteString ... Почему? потому что строки неизменяемы, и мы не мутировали их. Все, что мы сделали, это «RE ASSIGN» favoriteString для новой строки. Это существенно отключило его от string1. В предыдущем примере, когда мы переименовали наш объект, мы ничего не назначали. (Ну, на самом деле ... мы это сделали, мы присвоили свойство name новой строке.) Вместо этого мы просто мутировали объект, который поддерживает связи между двумя переменными и базовыми объектами.

Теперь, на функции и параметры передачи .... Когда вы вызываете функцию и передаете параметр, то, что вы по существу делаете, это «назначение» новой переменной, и она работает точно так же, как если бы вы просто назначили использование равного ( =).

Возьмем эти примеры.

var myString = 'hello';

// Assign to a new variable (just like when you pass to a function)
var param1 = myString; 
param1 = 'world'; // Re assignment

console.log(myString); // logs 'hello'
console.log(param1);   // logs 'world'

Теперь то же самое, но с функцией

function myFunc(param1) {
    param1 = 'world';

    console.log(param1);   // logs 'world'
}

var myString = 'hello';
// Calls myFunc and assigns param1 to myString just like param1 = myString
myFunc(myString); 

console.log(myString); // logs 'hello'

OK, теперь давайте несколько примеров с использованием объектов вместо этого ... во-первых, без функции.

var myObject = {
    firstName: 'Joe',
    lastName: 'Smith'
};

// Assign to a new variable (just like when you pass to a function)
var otherObj = myObject;

// Let's mutate our object
otherObj.firstName = 'Sue'; // I guess Joe decided to be a girl

console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Sue'

// Now, let's reassign
otherObj = {
    firstName: 'Jack',
    lastName: 'Frost'
};

// Now, otherObj and myObject are assigned to 2 very different objects
// And mutating one object no longer mutates the other
console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Jack';

Теперь то же самое, но с вызовом функции

function myFunc(otherObj) {

    // Let's mutate our object
    otherObj.firstName = 'Sue';
    console.log(otherObj.firstName); // Logs 'Sue'

    // Now let's re-assign
    otherObj = {
        firstName: 'Jack',
        lastName: 'Frost'
    };
    console.log(otherObj.firstName); // Logs 'Jack'

    // Again, otherObj and myObject are assigned to 2 very different objects
    // And mutating one object no longer mutates the other
}

var myObject = {
    firstName: 'Joe',
    lastName: 'Smith'
};

// Calls myFunc and assigns otherObj to myObject just like otherObj = myObject
myFunc(myObject);

console.log(myObject.firstName); // Logs 'Sue', just like before

OK, если вы прочитайте весь этот пост, возможно, теперь у вас есть лучшее понимание того, как вызовы функций работают в javascript. Не имеет значения, передается ли что-то по ссылке или по значению ... Что важно, так это назначение vs mutation.

Каждый раз, когда вы передаете переменную функции, вы «назначаете» любое имя переменной параметра, как если бы вы использовали знак равенства (=).

Всегда помните, что знак равенства (=) означает назначение. Всегда помните, что передача параметра функции также означает назначение. Они одинаковы, и 2 переменные связаны точно так же.

Единственный раз, когда изменение переменной влияет на другую переменную, - это когда основной объект мутирован.

Там нет смысла проводить различия между объектами и примитивами, поскольку он работает точно так же, как если бы у вас не было функции, и просто использовал знак равенства для назначения новой переменной.

Единственный gotcha - это когда имя переменной, которую вы передаете в функцию, совпадает с именем параметра функции. Когда это происходит, вы должны обрабатывать параметр внутри функции, как если бы это была целая новая переменная, закрытая для функции (потому что это так)

function myFunc(myString) {
    // myString is private and does not affect the outer variable
    myString = 'hello';
}

var myString = 'test';
myString = myString; // Does nothing, myString is still 'test';

myFunc(myString);
console.log(myString); // logs 'test'
136
задан grmn.bob 18 March 2010 в 01:16
поделиться

9 ответов

Я узнал, что сообщения об ошибках, подобные этому, обычно правы. Когда это не могло быть POSSIBLY (в вашем сознании), о чем сообщается сообщаемая ошибка, вы отправляетесь на поиски проблемы в другой области ... только чтобы узнать через несколько часов, что исходное сообщение об ошибке было действительно правильным.

Поскольку вы используете Eclipse, я думаю, что Thilo имеет это право. Наиболее вероятная причина, по которой вы получаете это сообщение, состоит в том, что один из ваших проектов составляет 1.6 класса. Неважно, есть ли у вас только 1.5 JRE в системе, потому что Eclipse имеет свой собственный компилятор (а не javac), и для компиляции 1.6 классов требуется только 1,5 JRE. Это может быть странно, и параметр необходимо отключить, чтобы это разрешить, но мне это просто удалось.

Для рассматриваемого проекта проверьте свойства проекта (обычно Alt + Enter), Java Compiler раздел. Вот образ проекта, сконфигурированного для компиляции 1.6, но с 1,5 JRE.

enter image description here [/g0]

183
ответ дан Nishant 22 August 2018 в 15:35
поделиться
  • 1
    Полностью согласен ... поэтому я в своем комментарии задал вопрос о способах pin-point. Я не знал о внутренних классах Eclipse. Библиотека была скомпилирована в командной строке с помощью javac и интегрирована в мой проект Eclipse. Я попытаюсь выполнить компиляцию моего проекта из командной строки. Вы явно решили эту проблему в прошлом, и ваши предложения фантастичны. – grmn.bob 18 March 2010 в 15:03
  • 2
    Если у вас есть JDK (у которого есть источники), вы должны добавить некоторые точки останова в Eclipse и, надеюсь, посмотреть, какой класс он пытается загрузить. Самый простой способ - это, вероятно, точка останова в конструкторе UnsupportedClassVersionError (или контрольная точка исключения Eclipse Exception, значок «J!»), Тогда вы можете проверить, как она туда попала. – Joshua McKinnon 18 March 2010 в 15:54
  • 3
    ОК. Я нашел эксперта в здании, и он смог указать Eclipse на ту же JRE, что и моя командная строка. Затем я восстановил против 1.6 и побежал против 1.6, и все это работает. Очевидно, я ошибался в том, что не имел ничего, кроме 1,5. Он показал мне, где искать. Спасибо за помощь - теперь я нахожусь в своей следующей проблеме! :) – grmn.bob 18 March 2010 в 16:15
  • 4
    Я была такая же проблема. Ошибка, которую я сделал, заключалась в использовании 1.5 JRE и 1.6 компилятора. Это не решило ошибку неподдерживаемой ошибки. Поэтому я установил 1.6 JRE в своем eclipse и использовал компилятор 1.6. Потом все стало нормально работать. – Vanchinathan Chandrasekaran 2 December 2010 в 18:58
  • 5
    Я хочу повторить это во второй раз, потому что это второй раз, когда у меня была проблема, обыск, нашел этот ответ, и это было правильно. & GT; _ & л; – AlbeyAmakiir 10 April 2013 в 00:49

Пробовали ли вы выполнить полную «чистую» и затем перестроить в Eclipse (Project-> Clean ...)?

Можете ли вы компилировать и запускать «javac» и «java» прямо из командной строки? Правильно ли это работает?

Если вы щелкните правой кнопкой мыши на своем проекте, перейдите в «Свойства», а затем перейдите к «Путь сборки Java», есть ли какие-либо подозрительные записи под любой вкладкой? Это, по сути, ваш CLASSPATH.

В настройках Eclipse вы также можете дважды проверить раздел «Установленные JRE» в разделе «Java» и убедиться, что он соответствует тому, что вы думаете.

У вас определенно есть устаревший файл .class, расположенный где-то, или вы получаете несоответствие времени компиляции / времени выполнения в версиях Java, которые вы используете.

8
ответ дан Brent Writes Code 22 August 2018 в 15:35
поделиться
  • 1
    да (полностью чистый); не пробовал (проект из линии cmd); возможно / нет (я удалил записи из Eclipse & quot; Java Build Path & quot;); сделал это (JREs - вот где я получил версию #). – grmn.bob 18 March 2010 в 15:05

Всегда проверяйте также очевидное. Я получил эту ошибку один раз, когда я случайно захватил неправильный ресурс для добавления и удаления действия сервера. Это можно легко упустить.

0
ответ дан James Drinkard 22 August 2018 в 15:35
поделиться
0
ответ дан Jay 22 August 2018 в 15:35
поделиться

Также проверьте любые файлы jar в вашем проекте, которые были скомпилированы для более высокой версии Java. Если это ваши собственные библиотеки, вы можете исправить это, изменив атрибут целевой версии на javac

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">
1
ответ дан Jeshurun 22 August 2018 в 15:35
поделиться

изменение проекта на использование java 1.7: для этого выполните следующие шаги:

  • Изменить уровень соответствия компилятора
  • Измените свои проекты JRE / JDK на что-то вроде тот же уровень (1,7 в моем случае)
  • Выполняйте те же изменения во всех проектах, на которые ссылается ваш проект
  • Измените конфигурацию прогона / отладки на использование JRE / JDK (или тот же уровень)

Не работает?

  • удалить проекты Каталог бинов
  • Очистить
  • reBuild

Все еще не работает?

в каталоге вашего проекта: отредактируйте .settings / org.eclipse.jdt.core.prefs> убедитесь, что ваш целевой уровень применен

Удачи!

0
ответ дан Li3ro 22 August 2018 в 15:35
поделиться

Вы скомпилировались с Eclipse? Он использует другой компилятор (не javac). Это не должно приводить к этой ошибке (если все настроено правильно), но вы можете попытаться скомпилировать ее с помощью javac.

Если это устранит проблему, попробуйте проверить, имеет ли Eclipse некоторые неправильные настройки компилятора. В частности, он нацелен на Java 5.

5
ответ дан Thilo 22 August 2018 в 15:35
поделиться
  • 1
    Это то, чему я учусь. Я попытаюсь построить две части одинаково (линия cmd и / или затмение). – grmn.bob 18 March 2010 в 15:05
  • 2
    Благодаря Thilo, я многому научился сегодня о Eclipse и Java и версиях классов. И немного о ant тоже. – grmn.bob 18 March 2010 в 16:16

Удаление файлов настроек проекта (рабочее пространство Eclipse / папка проекта / .settings /) из папки проекта также будет выполнено. Очевидно, нам нужно сделать проект чистым и построить после удаления.

0
ответ дан user3471219 22 August 2018 в 15:35
поделиться

У меня тоже такая же ошибка. Причина, по которой я составлял проект с использованием Maven. У меня был JAVA_HOME, указывающий на JDK7, и, следовательно, java 1.7 использовался для компиляции, а при запуске проекта я использовал JDK1.5. Изменение этой записи в файле .classpath или изменение затмения, как на скриншоте, позволило решить проблему.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

или изменить конфигурацию запуска eclipse как

2
ответ дан Vikky 22 August 2018 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: