Как eclipse выполняет Java-код при возникновении ошибок компиляции

Когда следующий код Java выполняется в Eclipse, он дает правильный вывод (то есть печатает «класс B»), но согласно спецификации Java код не может быть скомпилирован (так как конструктор суперкласса требуетint Аргумент и конструктор, предоставляемые компилятором для класса B, включают в себя вызов суперкласса без конструктора arg (который не определен), а при попытке скомпилировать файл с помощью команды javac в командной строке он компилирует только супер класс, т.е. A и завершается со следующей ошибкой компиляции:

<code>B.java:8: cannot find symbol
symbol  : constructor A()
location: class A
public class B extends A {
   ^
1 error
</code>

Ниже приводится содержимое файла Java:

<code>class A {

    public A(int x) {
        //
    }
}

public class B extends A {

    public static void main(String[] args) {
        System.out.println("Class b");
    }
}
</code>

Может кто-нибудь объяснить, как eclipse выполняет метод main без возможности bieng скомпилировать класс. Заранее спасибо.

UPDATE

Я удалил файл .class, созданный eclipse, в папке bin и попытался выполнить класс, но его не удалось скомпилировать, поэтому он не запустился. Но когда я создал исходный файл с общедоступным именем класса и сохранил его без содержимого, а затем добавил вышеупомянутое содержимое, это сработало. Если eclipse использует ранее скомпилированную версию для выполнения, как она может дать выводmain метод, так как он не имелmain метод на момент успеха полной компиляции?

 Nitin Chhajer11 мая 2012 г., 09:12
Вы выполняете тот же файл или другой основной класс?
 Dilini Rajapaksha11 мая 2012 г., 09:20
выполнение того же файла

Ответы на вопрос(3)

Решение Вопроса

Eclipse использует свой собственный компилятор Java (называемыйecj) вместоjavac, Этот компиляторпозволяет (частично) компилировать испорченные исходные файлы.

На самом деле eclipse пытается скомпилировать класс и не может скомпилировать его из-за ошибок сборки, когда вы просто запускаете те файлы, в которых он выполнял ранее скомпилированный класс, которые были успешно скомпилированы ранее (eclipse пытается компилировать и создавать файлы при каждом сохранении как за общие настройки).

чтобы решить проблему, вы можете попробовать очистить проект перед запуском, а в случае с javac он просто компилируется,

 Dilini Rajapaksha11 мая 2012 г., 09:05
Пробовал очистить проект, но он все равно дает тот же вывод, а также я создал исходный файл и сохранил в конце (после ввода всего кода) в eclipse, поэтому невозможно иметь предварительно скомпилированную версию класса.
 11 мая 2012 г., 09:08
Но когда мы делаем то же самое, он сообщает о проблеме, не может работать вообще, не могли бы вы попробовать создать новое рабочее пространство и посмотреть, работает ли он там
 11 мая 2012 г., 08:56
основанный на предыдущей скомпилированной версии файла, он заменит только те старые файлы классов после успешной компиляции
 Dilini Rajapaksha11 мая 2012 г., 09:37
Согласно обновлению моего вопроса, я не понимаю, как Eclipse вставляет новые части исходного кода в ранее скомпилированный класс.
 Dilini Rajapaksha11 мая 2012 г., 08:55
Спасибо за ответ, eclipse показывает ошибку компиляции, но мой вопрос заключается в том, как eclipse выполняет код и выдает результат, несмотря на наличие ошибок компиляции.

Затмение не должно этого делать. Это приводит к неоднозначным результатам. Если класс не может быть скомпилирован, то соответствующий ему файл .class должен быть удален.

Если вы проверите папку bin, B.class и A.class присутствуют. Не уверен, почему он создает B.class, хотя B не компилируется

Ваш ответ на вопрос