2013-08-05 3 views
3
interface A 
    { 
     public void f(); 
     public void g(); 
    } 


    class B implements A 
    { 
     public void f() 
     { 
      System.out.println("B.f()"); 
     } 
    } 

    public class Main 
    { 
     public static void main(String[] args) 
     { 
      B tmp = new B(); 
      tmp.f(); 
      System.out.println("B.f()"); 
     } 
    } 

Я не реализуют весь метод в интерфейсе А в В и имеет ошибку,почему Java может работать с компиляции ошибки времени в затмении

The type B must implement the inherited abstract method A.g() 

но почему он может получить вывод, что

B.f() 
    B.f() 
+0

Это невозможно. Я предполагаю, что у вас есть старый «класс B» в вашем пути к классам, который был скомпилирован против старой версии «интерфейса». –

+0

@UwePlonus это просто тест, который с одним файлом в проекте. – CLS

+0

вы не реализовали метод 'g()', который вызывает ошибку компиляции, и очень сильно, когда вы выполняете свой класс, его исполняющая последняя успешная скомпилированная версия – user902383

ответ

2

Eclipse может «исправлять» некоторые классы ошибок компиляции и запускать программу, даже если существуют ошибки. Как правило, вы получите диалоговое окно, в котором говорится следующее: существует

Ошибки в требуемом проекте (ы):

(название проекта)

Действуйте с запуском?

[X] Всегда запускать, не спрашивая

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

В этом случае, Eclipse добавляет фиктивный B.g() метод, содержащий только следующие:

throw new java.lang.Error("Unresolved compilation problem: \n" 
"The type B must implement the inherited abstract method A.g()"); 

Вставив этот фиктивный метод, то код будет компилироваться правильно, и он будет работать. Если вы никогда не звоните B.g, вы никогда не увидите эту ошибку.

3

Eclipse, позволяет запускать код с ошибками во время компиляции - после предоставления вам предупреждение и предлагает вам возможность, чтобы отступить (который обычно следует брать).

Если вы попытаетесь позвонить tmp.g(), вы получите исключение, указывающее на сбой во время компиляции.

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

+0

Что. Кажется, это немного неприятная магия ... любая причина, почему Eclipse поддерживает это? – nneonneo

+0

Кроме того, эта функция документирована где угодно? – nneonneo

+0

Также этот ответ разрешает [этот другой вопрос] (http://stackoverflow.com/questions/10546718/how-eclipse-execute-java-code-when-there-are-compile-errors), где никто не мог достаточно выяснить, что происходит. – nneonneo

Смежные вопросы