必须将类声明为abstract或实现抽象方法

时间:2015-01-01 18:56:31

标签: android deezer

我在github上找到了一个迷你Deezer播放器,但我认为它已经在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();
            }
        };`

粗体功能给我一个错误,内容如下:

  

Class'从DialogListener派生的匿名类'必须是   声明抽象或实现抽象方法   ' onException的(异常)'在' DialogListener'。

我不知道是什么问题,但是为了加重伤害,第一个@Override一切都很好,但是第二个,第三个和最后一个给了我这个错误:

  

错误:(91,17)错误:方法不会覆盖或实现方法   来自超类

这应该是一个有效的代码片段,所以这里有什么问题,为什么对某些@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)

可能会引发以下例外情况: OAuthExceptionDeezerErrorDialogError

我想我会在这里发布所有其他数据。

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'

我将不得不继续努力,但这是一个不同的问题。

2 个答案:

答案 0 :(得分:6)

正如您在评论中提到的,Deezer doc说DialogListener有3种方法: onCancel(),onComplete(Bundle values),onException(Exception 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中可能存在相同的内容吗?

答案 1 :(得分:2)

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

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

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

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