【问题标题】:Class must either be declared abstract or implement abstract method类必须声明为抽象或实现抽象方法
【发布时间】:2015-02-28 06:47:18
【问题描述】:

我在 github 上找到了一个迷你 Deezer 播放器,但我认为它是在 Eclipse 中编码的。然而,我在 Android Studio 中工作。

作为我的第一个 Android 应用程序,这一定是一个菜鸟问题,但我被困在这个问题上:

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 派生的匿名类”必须是 声明抽象或实现抽象方法 'DialogListener' 中的'onException(Exception)'。

我不知道是什么问题,但雪上加霜,第一个 @Override 一切正常,但第二个、第三个和最后一个给我这个错误:

Error:(91, 17) 错误:方法没有覆盖或实现方法 来自超类型

这应该是一个工作代码sn-p,那么这里有什么问题,为什么会抱怨一些@Overrides?

这两个错误有关联吗?

编辑1:

按照建议,我添加了另一个功能:

@Override
            public void onException(Exception exception) {

            }

第一个错误消失了。难道github上的原始代码是为之前版本的SDK写的,做的不一样?

@Override 错误仍然存​​在。但据我所知,这些是 onException 的子异常?

编辑2:

这是在 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'

我将不得不解决这个问题,但现在这是一个不同的问题。

【问题讨论】:

  • 你能告诉我们DialogListener类(或接口)的定义吗?是的,这两个错误似乎是相关的。
  • 这是在 Deezer SDK 中定义的: import com.deezer.sdk.network.connect.event.DialogListener;我正在查看他们的文档,它在“方法摘要”下提到:onCancel()、onComplete(Bundle values)、onException(Exception exception)。它还说:在身份验证过程中抛出异常时调用 void onException(Exception exception)。可能会引发以下异常:OAuthException、DeezerError、DialogError。我想我错过了编辑器的一些东西??
  • @iggy 我已经更新了我的答案。

标签: android deezer


【解决方案1】:

在 Java 中实现匿名抽象类或接口时,必须为所有抽象方法(如果是抽象类)或接口中声明的所有方法提供实现。

您收到的错误通知您没有实现DialogListener 中声明的onException 方法。

其他错误很可能与第一个错误有关,但也不一定如此。通常,您犯的单个错误可能会触发多个编译器错误,在这种情况下,当您第一次清除另一个错误时,其他错误也会被清除。当您确实遇到编译器错误时,您应该始终专注于清除第一个错误,因为其他错误可能是假错误而不是真正的问题。

"method does not override or implement a method from a supertype" 也可能意味着您声明的方法的签名与抽象类中的签名不匹配,在这种情况下,@Override 不会被编译器接受。

【讨论】:

  • 谢谢,还没有,但继续前进。见原帖。
  • 我认为您的最后一次编辑越来越接近我的问题...谢谢!
【解决方案2】:

正如您在评论中提到的,Deezer 文档说 DialogListener 有 3 种方法: onCancel(), onComplete(Bundle values), onException(Exception 异常)。

所以你只需要实现这 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 中也存在同样的情况?

【讨论】:

  • 我不知道,我已经在 Android Studio 中编程了 6 小时。将谷歌它...谢谢!
  • @iggy 希望对您有所帮助。如果有帮助,请采纳答案。
  • 你们俩在大约 2 小时内提出了相同的解决方案。同时。我怎么能相信你们俩?
  • 当,决定接受你的回答,但不能投票给 Dalija。抱歉,Dalija,希望我最终能以某种方式回报这个人情,你们俩都帮了大忙。
  • 别担心,很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多