Класс должен быть либо объявлен абстрактным, либо реализовать абстрактный метод

Я нашел мини-Deezer плеер на github, но я думаю, что он был закодирован в Eclipse. Однако я работаю в Android Studio.

Beeing мое первое приложение для Android это должен быть вопрос noob, но я застрял на этом:

private DialogListener mDeezerDialogListener = new **DialogListener**() { @Override public void onComplete(Bundle values) { // store the current authentication info SessionStore sessionStore = new SessionStore(); sessionStore.save(mDeezerConnect, LoginActivity.this); // Launch the Home activity Intent intent = new Intent(LoginActivity.this, HomeActivity.class); startActivity(intent); } @Override public void onDeezerError(final DeezerError deezerError) { Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, Toast.LENGTH_LONG).show(); } @Override public void onError(final DialogError dialogError) { Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, Toast.LENGTH_LONG).show(); } @Override public void onCancel() { Toast.makeText(LoginActivity.this, R.string.login_cancelled, Toast.LENGTH_LONG).show(); } @Override public void onOAuthException(OAuthException oAuthException) { Toast.makeText(LoginActivity.this, R.string.invalid_credentials, Toast.LENGTH_LONG) .show(); } };` 

Жирная функция дает мне ошибку, которая гласит:

Класс «Анонимный класс, полученный из DialogListener», должен либо быть объявлен абстрактным, либо реализовать абстрактный метод «onException (Exception)» в «DialogListener».

Я понятия не имею, в чем проблема, но чтобы добавить оскорбление к травме, все хорошо с первым @Override, но второй, третий и последний дают мне эту ошибку:

Ошибка: (91, 17) error: метод не переопределяет или не реализует метод из супертипа

Предполагается, что это фрагмент рабочего кода, поэтому в чем проблема, почему жалобы на некоторые из @Overrides?

Связаны ли эти две ошибки?

EDIT1:

Как я уже сказал, я добавил еще одну функцию:

 @Override public void onException(Exception exception) { } 

И первая ошибка исчезла. Может быть, исходный код на github был написан для предыдущей версии SDK, что делало разные вещи?

Ошибка @Override. Но, насколько я вижу, это исключения для onException?

EDIT2:

Это определено в Deezer SDK:

 import com.deezer.sdk.network.connect.event.DialogListener; 

Я смотрю их документацию, и она упоминается в разделе «Сводка методов»: onCancel() , onComplete(Bundle values) , onException(Exception exception) .

В нем также говорится: void onException(Exception exception) вызывается, когда во время процесса аутентификации возникает исключение.

Могут быть подняты следующие исключения: OAuthException , DeezerError , DialogError .

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

EDIT3:

Вот как я переписал код:

 @Override public void onException(Exception exception) { if(exception instanceof DeezerError){ Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, Toast.LENGTH_LONG).show(); } else if(exception instanceof DialogError){ Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, Toast.LENGTH_LONG).show(); } else if(exception instanceof OAuthException){ Toast.makeText(LoginActivity.this, R.string.invalid_credentials, Toast.LENGTH_LONG) .show(); } else{ //not implemented? } } 

Предоставляет предупреждение: Condition 'exception instanceof OAuthException' is always 'false' .

Мне придется работать над этим, но теперь это другой вопрос.

Как вы отметили в своем комментарии, в документе Deezer говорится, что DialogListener имеет 3 метода: onCancel (), onComplete (значения Bundle), onException (исключение исключения).

Таким образом, вы должны реализовать ТОЛЬКО эти 3 функции.

  @Override public void onComplete(Bundle values) { // store the current authentication info SessionStore sessionStore = new SessionStore(); sessionStore.save(mDeezerConnect, LoginActivity.this); // Launch the Home activity Intent intent = new Intent(LoginActivity.this, HomeActivity.class); startActivity(intent); } @Override public void onCancel() { Toast.makeText(LoginActivity.this, R.string.login_cancelled, Toast.LENGTH_LONG).show(); } @Override public void onException(Exception e) { // ... } 

И удалите другие методы: onError и т. Д. Возможно, вы, например, предположите, что это пример другой версии SDK.

Примечание. Я не использую Android Studio, но в Eclipse у вас есть команда для автоматического создания необходимых методов (пустой, с упоминанием «TODO»). Может быть, такое же есть в Android Studio?

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

Ошибка, которую вы получаете, уведомляет вас о том, что вы не реализовали метод onException , объявленный в DialogListener .

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

"method does not override or implement a method from a supertype" также может означать, что подпись заявленных методов не соответствует подписи в абстрактном классе, и в этом случае @Override не принимает @Override .